9

.ZIPアーカイブを解凍する必要があります。私はすでにそれを解凍する方法を知っていますが、それは巨大なファイルであり、抽出するのに少し時間がかかります。抽出の完了率を印刷するにはどうすればよいですか?私はこのようなものが欲しいです:

Extracting File
1% Complete
2% Complete
etc, etc
4

5 に答える 5

17

ここにあなたが始めることができる例があります、それは最適化されていません:

import zipfile

zf = zipfile.ZipFile('test.zip')

uncompress_size = sum((file.file_size for file in zf.infolist()))

extracted_size = 0

for file in zf.infolist():
    extracted_size += file.file_size
    print "%s %%" % (extracted_size * 100/uncompress_size)
    zf.extract(file)

それをより美しくするために、印刷するときにこれを行います:

 print "%s %%\r" % (extracted_size * 100/uncompress_size),
于 2010-10-24T03:33:57.740 に答える
8

抽出されている各ファイルの進行状況を監視するには、次のコマンドを使用しますtqdm()

from zipfile import ZipFile
from tqdm import tqdm

# Open your .zip file
with ZipFile(file=path) as zip_file:

    # Loop over each file
    for file in tqdm(iterable=zip_file.namelist(), total=len(zip_file.namelist())):

        # Extract each file to another directory
        # If you want to extract to current working directory, don't specify path
        zip_file.extract(member=file, path=directory)
于 2018-11-21T04:00:48.477 に答える
4

Python 2.6では、ZipFileオブジェクトにopenメソッドがあり、名前付きファイルをzipでファイルオブジェクトとして開くことができます。これを訴えて、データをチャンクで読み取ることができます。

import zipfile
import os

def read_in_chunks(zf, name):
    chunk_size= 4096
    f = zf.open(name)
    data_list = []
    total_read = 0
    while 1:
        data = f.read(chunk_size)
        total_read += len(data)
        print "read",total_read
        if not data:
            break
        data_list.append(data)

    return "".join(data_list)

zip_file_path = r"C:\Users\anurag\Projects\untitled-3.zip"
zf = zipfile.ZipFile(zip_file_path, "r")
for name in zf.namelist():
    data = read_in_chunks(zf, name)

編集:合計サイズを取得するには、次のようにすることができます

total_size = sum((file.file_size for file in zf.infolist()))

これで、進行状況の合計とファイルごとの進行状況を印刷できます。たとえば、zipに大きなファイルが1つしかない場合、他の方法(たとえば、ファイルサイズを数えて抽出するだけ)では、進行状況はまったく表示されません。

于 2010-10-24T03:50:23.177 に答える
1

ZipFile.getinfolist()ZipInfozipファイルの内容からいくつかのオブジェクトを生成します。そこから、アーカイブ内のすべてのファイルのバイト数を合計してから、これまでに抽出した数をカウントするか、合計ファイル数で計算することができます。

于 2010-10-24T03:28:10.720 に答える
0

単一のファイルの抽出の進行状況を追跡できるとは思いません。zipfile抽出関数には、進行状況のコールバックがありません。

于 2010-10-24T03:29:16.893 に答える