监视ZIP文件提取Python

监视ZIP文件提取Python,python,zip,monitor,progress,extraction,Python,Zip,Monitor,Progress,Extraction,我需要解压缩一个.ZIP文件。我已经知道如何解压它,但它是一个巨大的文件,需要一些时间来提取。如何打印提取完成的百分比?我想要这样的东西: Extracting File 1% Complete 2% Complete etc, etc 将从zip文件的内容生成许多ZipInfo对象。从这里,您可以将存档中所有文件的字节数相加,然后计算到目前为止已提取的文件数,也可以按文件总数计算。我认为您无法跟踪提取单个文件的进度。没有进度回调。这里是一个示例,您可以从它开始,它没有优化: import z

我需要解压缩一个.ZIP文件。我已经知道如何解压它,但它是一个巨大的文件,需要一些时间来提取。如何打印提取完成的百分比?我想要这样的东西:

Extracting File
1% Complete
2% Complete
etc, etc

将从zip文件的内容生成许多
ZipInfo
对象。从这里,您可以将存档中所有文件的字节数相加,然后计算到目前为止已提取的文件数,也可以按文件总数计算。

我认为您无法跟踪提取单个文件的进度。没有进度回调。

这里是一个示例,您可以从它开始,它没有优化:

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),

在Python2.6中,ZipFile对象有一个方法,可以在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中只有一个大文件,其他方法(例如,仅计算文件大小和提取)根本不会给出任何进度。

您可以使用以下方法监视提取的每个文件的进度:


这段代码非常有效!谢谢oyu知道我如何得到未压缩拉链的总尺寸吗?这样我可以打印XXXXX的XXXXX完美!这正是我想要的!!谢谢
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)