python解压文件并提供wxPython状态栏的更新
我有几个大的zip文件,其中包含我必须维护的dir结构。目前我使用的解压方法是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 = 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)
的文件量,而不是循环的第一个文件量。