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状态栏的主要内容,如果未能解决你的问题,请参考以下文章

使用 Python 解压缩文件并返回它创建的所有目录

将文件解压缩到内存中,调整文件,压缩并流式传输到客户端(Node.js)

使用 Python 下载并解压缩文件

linux unzip 怎么强制覆盖?

python 用zipfile对文件进行压缩并加密(不让人解压缩并修改文件)如何实现

unzip---解压缩“.zip”压缩包。