六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 50|回复: 0

python的音乐本地搜索统计的小工具(速度优化版)

[复制链接]

升级  48%

6

主题

6

主题

6

主题

童生

Rank: 1

积分
24
 楼主| 发表于 2013-1-15 02:55:10 | 显示全部楼层 |阅读模式
加入了stackless微线程,速度大大的提高!!#coding=gb2312import osimport fnmatchimport wximport reimport timeimport stacklessdef get_allfile_name(path):   #获得全部文件夹的文件名    l=[]    for p,d,f in os.walk(path):        for i in f:            l.append(os.path.join(p,i))    return lclass Search_music(wx.Frame):    def __init__(self):        wx.Frame.__init__(self,None,-1,"音乐查找 v2.0",size=(300,330),style=wx.DEFAULT_FRAME_STYLE^wx.RESIZE_BORDER)        panel=wx.Panel(self,-1)        self.mymusicList=['mp3','wav','wma','cue']    #------------------------------------------------------------------------------ 文件夹        self.st1=wx.StaticText(panel,-1,"给我一个路径 ,我将翻透你的硬盘 :",(15,15))        self.st1_pos_y=self.st1.GetPosition().y+self.st1.GetSize().height        self.t1=wx.TextCtrl(panel,-1,"",style=0,size=(185,25),pos=(15,self.st1_pos_y+10))        self.t1_pos_x=self.t1.GetPosition().x+self.t1.GetSize().width+10        self.b1=wx.Button(panel,-1,"浏览",pos=(self.t1_pos_x,self.st1_pos_y+10),size=(45,25),style=0)        self.Bind(wx.EVT_BUTTON, self.GetDir, self.b1)#------------------------------------------------------------查询数据类型-----------------        self.st2=wx.StaticText(panel,-1,"音乐查询类型 :",(15,self.st1_pos_y+45))        self.st2_pos_y=self.st2.GetPosition().y+self.st2.GetSize().height        self.st2_pos_x=self.st2.GetPosition().y+self.st2.GetSize().width        lb=wx.CheckListBox(panel,-1,(15,self.st2_pos_y+10),wx.DefaultSize,self.mymusicList)        lb.SetSelection(0)        self.lb=lb        pos_y=lb.GetPosition().y+lb.GetSize().height+10        pos_x=lb.GetPosition().x+lb.GetSize().width+15#------------------------------------------------------------------------------ 统计面板        multiLabel=wx.StaticText(panel,-1,"统计结果",(self.st2_pos_x-10,self.st1_pos_y+45))        multiLabel_pos_y=multiLabel.GetPosition().y+multiLabel.GetSize().height+15        self.multiText=wx.TextCtrl(panel,-1,            "",size=(140,190),style=wx.TE_MULTILINE,pos=(self.st2_pos_x-10,self.st2_pos_y+10))#创建一个文本控件        self.multiText.SetInsertionPoint(0)#设置插入点        #------------------------------------------------------------------------------ 进度条        self.gauage=wx.Gauge(panel,-1,100,(15,pos_y+40),(70,20))        self.gauage.SetBezelFace(3)        self.gauage.SetShadowWidth(3)                                #-------------------------------------------------------------------------------总数据发送按钮                btn=wx.Button(panel,-1,'搜索', (15, pos_y+70))        self.Bind(wx.EVT_BUTTON,self.OnTestButton,btn)                  def OnTestButton(self,event):        dict={}        all_word=[]  #所有要显示在面板上的        all_songs_num=0   #歌曲总数        mycue_number=0                                        for i in self.lb.GetCheckedStrings():#做一个字典{文件类型:[文件路径名]}            dict[i]=[]        if self.t1.GetValue()=='' or self.lb.GetCheckedStrings()==():            wx.MessageBox('靓仔!信息不完整哦!','出错了',wx.ICON_EXCLAMATION)            s=''        elif not os.path.isdir(self.t1.GetValue()):            wx.MessageBox('靓仔!路径不合法!','出错了',wx.ICON_EXCLAMATION)            s=''        else:            self.gauage.SetValue(10) #标记进度条                              All_files=get_allfile_name(self.t1.GetValue())            def my_stackless_task(my_str):                for f in All_files:                    if fnmatch.fnmatch(f,'*.%s'%my_str):                        dict[my_str].append(f)                                       self.gauage.SetValue(50) #标记进度条           # if 'ape' in self.lb.GetCheckedStrings():                        for i in self.lb.GetCheckedStrings():                stackless.tasklet(my_stackless_task)(i)            stackless.run()                        self.gauage.SetValue(90)                                for i in self.lb.GetCheckedStrings():                #print i,len(dict[i])                if i!='cue':                    all_songs_num=all_songs_num+len(dict[i])                    all_word.append('%s有:%s \n'%(i,len(dict[i])))                else:                    the_cue_num=len(dict[i])                            if 'cue' in self.lb.GetCheckedStrings() and len(dict['cue'])!=0:                #print dict['cue']                 for mycuefile in dict['cue']:                    #print mycuefile                    mycue_number=mycue_number+self.find_audionumber_in_ape(mycuefile)                all_word.append('ape内曲目:%d'%(mycue_number))                           all_word.insert(0, '歌曲【%s】总数(含ape内音频):%d\n'%(str(self.lb.GetCheckedStrings()),(all_songs_num+mycue_number)))                        s="\n".join(all_word)              self.gauage.SetValue(100)#标记进度条                      self.multiText.SetValue(s)            self.gauage.SetValue(0)#标记进度条                 def find_audionumber_in_ape(self,cuefile):  #对所有的cue文件进行操作        try:            #print cuefile            myfile=open(r"%s"%cuefile,'r')            all_str=myfile.readlines()            myfile.close()            all_str.reverse()            for n in all_str:                if re.search("^  TRACK",n):                    break            p=re.compile('.[0-9][0-9].')            return int(p.search(n).group())                    except:            errorfile=open('music_error.log','a')            errorfile.write('\n 时间:%s    文件【%s】找不到了哇\n'%(time.ctime(time.time()),cuefile))            errorfile.close()             return 0                                       def GetDir(self,event):        self.t1.SetValue(wx.DirSelector("我的音乐目录",defaultPath="",style=0,pos=wx.DefaultPosition,parent=None))if __name__=='__main__':    app=wx.PySimpleApp()    frame=Search_music()    frame.Show()    app.MainLoop()
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表