Извлечь ZipFile с помощью Python, показать процент выполнения? - PullRequest
7 голосов
/ 03 декабря 2010

Я знаю, как извлечь zip-архив с помощью Python, но как точно отобразить прогресс этого извлечения в процентах?

Ответы [ 2 ]

6 голосов
/ 03 декабря 2010

метод извлечения не обеспечивает обратного вызова для этого, поэтому нужно будет использовать getinfo, чтобы получить несжатый размер e, а затем открыть файл, прочитанный из него в блоках, и записать его в нужное место чтобы перейти и обновить процент, нужно также восстановить mtime, если это требуется в качестве примера:

import zipfile
z = zipfile.ZipFile(some_source)
entry_info = z.getinfo(entry_name)
i = z.open(entry_name)
o = open(target_name, 'w')
offset = 0
while True:
    b = i.read(block_size)
    offset += len(b)
    set_percentage(float(offset)/float(entry_info.file_size) * 100.)
    if b == '':
        break
    o.write(b)
i.close()
o.close()
set_attributes_from(entry_info)

это извлекает entry_name до target_name


Большая часть этого также сделана shutil.copyfileobj, но она не имеет обратного вызова для прогресса

источник вызовов метода ZipFile.extract _extract_member использует:

source = self.open(member, pwd=pwd)
target = file(targetpath, "wb")
shutil.copyfileobj(source, target)
source.close()
target.close()

где член был преобразован из имени в объект ZipInfo с помощью getinfo(member), если это не был объект ZipInfo

0 голосов
/ 10 июля 2019

Я предлагаю использовать tqdm, это очень просто, вот так:

>>> with zipfile.ZipFile(some_source) as zf:
...     for member in tqdm(zf.infolist(), desc='Extracting '):
...         try:
...             zf.extract(member, target_path)
...         except zipfile.error as e:
...             pass

Это выдаст примерно так:

Extracting : 100%|██████████| 60.0k/60.0k [14:56<00:00, 66.9File/s]
...