2

維持しなければならない dir 構造を含むいくつかの大きな 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) の進行状況を表示する方法を思いつきませんでした。

4

2 に答える 2

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 に答える