Python распаковать файлы и предоставить обновление в строке состояния wxPython - PullRequest
2 голосов
/ 06 апреля 2011

У меня есть несколько больших zip-файлов, которые содержат структуру dir, которую я должен поддерживать. В настоящее время для распаковки я использую

    zip = zipfile.ZipFile(self.fileName)        
    zip.extractall(self.destination)
    zip.close()

Проблема в том, что этот процесс может занять более 3-5 минут, и у меня нет отзывов, что они все еще работают. Я хотел бы вывести имя файла, который сейчас разархивирован, в строку состояния моего графического интерфейса. Я имею в виду что-то вроде

    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 (имя файла).

Ответы [ 2 ]

2 голосов
/ 06 апреля 2011

Я нашел это приемлемое решение - хотя я думаю, что я предпочел бы, чтобы это было в конечном итоге.

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()
0 голосов
/ 04 февраля 2015

Вы можете использовать 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 должен быть вызван внутри соответствующего слота.

...