python解压文件并提供wxPython状态栏的更新

python解压文件并提供wxPython状态栏的更新,python,progress,statusbar,progressdialog,zipfile,Python,Progress,Statusbar,Progressdialog,Zipfile,我有几个大的zip文件,其中包含我必须维护的dir结构。目前我使用的解压方法是 zip = zipfile.ZipFile(self.fileName) zip.extractall(self.destination) zip.close() 问题是,这些过程可能需要3-5分钟,我没有反馈,他们仍然在工作。我想做的是将当前正在解压的文件名输出到gui的状态栏。我想的是 zip = zipfile.ZipFile(self.fileName)

我有几个大的zip文件,其中包含我必须维护的dir结构。目前我使用的解压方法是

    zip = zipfile.ZipFile(self.fileName)        
    zip.extractall(self.destination)
    zip.close()
问题是,这些过程可能需要3-5分钟,我没有反馈,他们仍然在工作。我想做的是将当前正在解压的文件名输出到gui的状态栏。我想的是

    zip = zipfile.ZipFile(self.fileName)
    zipNameList = zipfile.namelist(self.fileName)
    for item in zipNameList:
        self.SetStatusText("Unzipping" + str(item))
        zip.extract(item)
    zip.close()
问题是它不能创建正确的dir结构。我不确定这是否是最好的解决方法


我也在考虑使用wx.progressdialog,但没有办法让它显示zip.extractall(文件名)的进度。

我找到了一个可接受的解决方案——尽管我想我最终还是希望它能线程化

def unzipItem(self, fileName, destination)
    print "--unzipItem--"
    zip = zipfile.ZipFile(fileName)
    nameList = zip.namelist()

    #get the amount of files in the file to properly size the progress bar
    fileCount = 0
    for item in nameList:
        fileCount += 1

    #Built progress dialog
    dlg = wx.ProgressDialog("Unziping files",
                           "An informative message",
                           fileCount,
                           parent = self,
                           )

    keepGoing = True
    count = 0

    for item in nameList:
        count += 1
        dir,file = os.path.split(item)
        print "unzip " + file

        #update status bar
        self.SetStatusText("Unziping " + str(item))
        #update progress dialog
        (keepGoing, skip) = dlg.Update(count, file)
        zip.extract(item,destination)

    zip.close()
您可以使用而不是
名称列表
。从文档中:

对象的顺序与其在实际ZIP中的条目相同 如果已打开现有存档文件,则磁盘上的文件

也请考虑此注释:

open()、read()和extract()方法可以采用文件名或ZipInfo对象。当您尝试读取包含重复名称的成员的ZIP文件时,您将了解这一点

所以你可以这样写:

ZipFile(zip文件名)作为myzipfile的
:
members=myzipfile.infolist()
对于我,枚举中的成员(成员):
myzipfile.extract(成员,目标路径)
self.SetStatusText(“Unziping”+str(i))
self.mysignal.emit(i)#使用它在线程内部进行更新

您可以将其放在一个线程上,然后通过一个信号进行更新,并且应该在相应的插槽中调用
SetStatusText
方法。

要获得可以使用
len(nameList)
的文件量,而不是循环的第一个文件量。