Мониторинг извлечения ZIP-файлов Python - PullRequest
6 голосов
/ 24 октября 2010

Мне нужно распаковать архив .ZIP. Я уже знаю, как распаковать его, но это огромный файл, и его извлечение занимает некоторое время. Как я могу напечатать процент завершения для извлечения? Я хотел бы что-то вроде этого:

Extracting File
1% Complete
2% Complete
etc, etc

Ответы [ 5 ]

13 голосов
/ 24 октября 2010

вот пример, с которого вы можете начать, он не оптимизирован:

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),
4 голосов
/ 24 октября 2010

В 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, другие методы (например, просто подсчет размеров файлов и извлечение) не дадут никакого прогресса вообще.

1 голос
/ 21 ноября 2018

Вы можете просто следить за ходом извлечения каждого файла с помощью 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)
1 голос
/ 24 октября 2010

ZipFile.getinfolist() сгенерирует количество ZipInfo объектов из содержимого zip-файла.Оттуда вы можете либо подсчитать количество байтов всех файлов в архиве, а затем подсчитать, сколько вы уже извлекли, или вы можете узнать общее количество файлов.

0 голосов
/ 24 октября 2010

Я не верю, что вы можете отслеживать процесс извлечения одного файла. Функция извлечения zipfile не имеет обратного вызова для прогресса.

...