python解压缩文件并提供更新到wxPython状态栏
Posted
技术标签:
【中文标题】python解压缩文件并提供更新到wxPython状态栏【英文标题】:python unzip files and provide update to wxPython status bar 【发布时间】:2011-07-30 22:04:07 【问题描述】:我有几个包含我必须维护的目录结构的大型 zip 文件。目前要解压缩它们我正在使用
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()
这样做的问题是它没有创建正确的目录结构。我不确定这是否是最好的方法。
我也在考虑使用 wx.progressdialog,但无法想出一种方法让它显示 zip.extractall(filename) 的进度。
【问题讨论】:
【参考方案1】:我得到了一个可以接受的解决方案 - 虽然我认为我最终更希望它线程化。
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()
【讨论】:
要获取文件的数量,您可以使用len(nameList)
而不是第一个 for 循环。【参考方案2】:
您可以使用infolist
代替namelist
。来自文档:
对象的顺序与其在实际 ZIP 中的条目顺序相同 如果打开了现有存档,则将文件保存在磁盘上。
另外,请考虑以下注释:
open()、read() 和 extract() 方法可以采用文件名或 ZipInfo 对象。当您尝试读取包含重名成员的 ZIP 文件时,您会意识到这一点。
所以你可以这样写:
with ZipFile(zip_file_name) as myzipfile:
members = myzipfile.infolist()
for i, member in enumerate(members):
myzipfile.extract(member, destination_path)
self.SetStatusText("Unziping " + str(i))
self.mysignal.emit(i) # use this to update inside a thread
你可以把它放在一个线程上,然后通过一个信号更新,SetStatusText
方法应该在对应的槽内被调用。
【讨论】:
以上是关于python解压缩文件并提供更新到wxPython状态栏的主要内容,如果未能解决你的问题,请参考以下文章
将文件解压缩到内存中,调整文件,压缩并流式传输到客户端(Node.js)