我需要解压缩一个 .ZIP 档案。我已经知道如何解压缩它,但它是一个巨大的文件,需要一些时间来解压。我将如何打印提取完成的百分比?我想要这样的东西:
Extracting File
1% Complete
2% Complete
etc, etc
我需要解压缩一个 .ZIP 档案。我已经知道如何解压缩它,但它是一个巨大的文件,需要一些时间来解压。我将如何打印提取完成的百分比?我想要这样的东西:
Extracting File
1% Complete
2% Complete
etc, etc
这是一个您可以开始的示例,它没有经过优化:
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),
您可以使用以下命令监控每个文件的提取进度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)
在 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 大文件,其他方法(例如仅计算文件大小和提取)根本不会给出任何进度。
ZipFile.getinfolist()
将从 zip 文件的内容生成许多ZipInfo
对象。从那里您可以合计存档中所有文件的字节数,然后计算到目前为止已提取的字节数,或者您可以按文件总数计算。
我不相信您可以跟踪提取单个文件的进度。zipfile 提取函数没有进度回调。