2

我有几个大的 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()

这样做的问题是它没有创建正确的目录结构。我不确定这甚至是最好的方法。

我也在考虑使用 wx.progressdialog,但无法想出一种方法来让它显示 zip.extractall(filename) 的进度。

4

2 回答 2

2

我得到了一个可以接受的解决方案——尽管我认为我最终更喜欢它。

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()
于 2011-04-06T18:29:53.073 回答
0

您可以使用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方法应该在相应的槽内调用。

于 2015-02-04T01:53:36.430 回答