监控Python解压ZIP文件

10 投票
5 回答
8880 浏览
提问于 2025-04-16 05:59

我需要解压一个 .ZIP 压缩文件。我已经知道怎么解压了,但这个文件很大,解压需要一些时间。我想知道怎么能显示解压的进度百分比。我希望能看到类似这样的内容:

Extracting File
1% Complete
2% Complete
etc, etc

5 个回答

4

在Python 2.6中,ZipFile对象有一个open方法,这个方法可以把压缩包里指定的文件打开成一个文件对象。你可以用这个方法分块读取数据。

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

这样你就可以打印出总进度和每个文件的进度了。例如,假设你在压缩包里只有一个大文件,其他方法(比如仅仅计算文件大小和提取)根本无法显示任何进度。

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

撰写回答