Python 监控 ZIP 文件解压缩

10

我需要解压一个.zip文件。我已经知道如何解压它,但是由于文件很大,解压需要一些时间。如何打印提取进度的百分比?我希望得到像这样的东西:

Extracting File
1% Complete
2% Complete
etc, etc
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),

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)

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文件的总大小吗?这样我就可以打印“已读取xxxxx中的xxxxx”了。 - Zac Brown

0

ZipFile.getinfolist()会从zip文件的内容中生成许多ZipInfo对象。然后,您可以将存档中所有文件的字节数总计起来,再逐个计算已提取的文件数量,或者按照文件总数进行计算。


-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接