метод извлечения не обеспечивает обратного вызова для этого, поэтому нужно будет использовать 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