监控ZIP文件提取Python

时间:2010-10-24 02:50:34

标签: python zip monitor progress extraction

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

Extracting File
1% Complete
2% Complete
etc, etc

5 个答案:

答案 0 :(得分:13)

这里有一个你可以开始的例子,它没有被优化:

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

答案 1 :(得分:3)

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

现在,您可以打印每个文件的总进度和进度,例如假设你只有1个zip文件,其他方法(例如只计算文件大小和提取)根本不会有任何进展。

答案 2 :(得分:1)

ZipFile.getinfolist()将从zip文件的内容生成许多ZipInfo个对象。从那里你可以总计档案中所有文件的字节数,然后计算你到目前为止提取的数量,或者你可以计算总文件数。

答案 3 :(得分:1)

您可以只监视tqdm()提取的每个文件的进度:

$ echo "3.2 .55 -1.2 -.9 2.2 .56 .24 .95 2.00 .35 5.9 1.1 2.8 .3" | \
./bin/rainfall
   January  3.20
  February  0.55
     March  2.20
     April  0.56
       May  0.24
      June  0.95
      July  2.00
    August  0.35
 September  5.90
   October  1.10
  November  2.80
  December  0.30

The most rainfall was 5.90 inches in September.
The least rainfall was 0.24 inches in May.
The total amount of rainfall for the year is 20.15 inches.
The average monthly rainfall for the year is 1.68 inches.

答案 4 :(得分:0)

我不相信您可以跟踪提取单个文件的进度。 zipfile extract function没有回复进展。