【问题标题】:python unzip files and provide update to wxPython status barpython解压缩文件并提供更新到wxPython状态栏
【发布时间】: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) 的进度。

【问题讨论】:

    标签: python progress statusbar progressdialog zipfile


    【解决方案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方法应该在对应的槽内被调用。

    【讨论】:

      猜你喜欢
      • 2021-10-04
      • 1970-01-01
      • 1970-01-01
      • 2017-02-03
      • 1970-01-01
      • 2011-12-28
      • 1970-01-01
      • 2011-09-01
      • 2020-01-15
      相关资源
      最近更新 更多