2010-12-03 20 views
7

私はPythonを使用してzipアーカイブを抽出する方法を知っていますが、パーセンテージでその抽出の進捗状況をどのように正確に表示できますか?Pythonを使用してZipFileを抽出し、進捗率を表示しますか?

+0

使用する予定のすべてのグラフィックフレームワークですか? –

+0

あなたが話していることがあれば、Tkinter。私が必要とするのは、テキストパーセンテージを表示できることだけです。 –

+1

やや汚れた回避策は、別のプロセスで抽出を生成し、メインスレッドから抽出されたファイルを監視し、それらのサイズを合計し、 'ZipInfo.file_size'で除算することです。 – Novikov

答えて

6

抽出方法ではコールバックが返されないため、getinfoを使用して圧縮されていないサイズの電子メールを取得し、ブロックから読み込んだファイルを開き、ファイルに保存する場所に書き込みます。

import zipfile 
z = zipfile.ZipFile(some_source) 
entry_info = z.getinfo(entry_name) 
i = z.open(entry_name) 
o = open(target_name, 'w') 
offset = 0 
while True: 
    b = i.read(block_size) 
    offset += len(b) 
    set_percentage(float(offset)/float(entry_info.file_size) * 100.) 
    if b == '': 
     break 
    o.write(b) 
i.close() 
o.close() 
set_attributes_from(entry_info) 

これはentry_name

target_nameから

を抽出し、これのほとんどはでもやっている:それは例を望まれる場合は、1つはまたのmtimeを回復しなければならない割合を行くと更新それが戻って進行のためにコールを持っていないかZipFile.extract方法のソースが_extract_memberを呼び出し

は使用しています:

メンバーが、それならば getinfo(member)で持つZipInfoオブジェクトに名前から変換された
source = self.open(member, pwd=pwd) 
target = file(targetpath, "wb") 
shutil.copyfileobj(source, target) 
source.close() 
target.close() 

ZipInfoオブジェクトではありませんでした

+0

OK、cool。私はこれが好き。唯一のことは、私のアーカイブにはフォルダが含まれていますが、なんらかの理由でアーカイブが抽出されないことです。ファイルが存在しないことを示す例外が発生します。 –

+0

ファイルエントリ名はパス名であるため、 'some/path/to/some/file'はファイルの名前であり、ディレクトリのエントリはありません。 –

+0

私はそれを持っています。私はzipfileモジュールで抽出メソッドを使用しました... OSモジュールのいくつかの使用と一緒に。ありがとう。 –

関連する問題