Начиная с Python 2.6, вы можете использовать ZipFile.open()
, чтобы открыть дескриптор файла для файла и эффективно скопировать содержимое в целевой файл по вашему выбору:
import errno
import os
import shutil
import zipfile
TARGETDIR = '/foo/bar/baz'
with open(doc, "rb") as zipsrc:
zfile = zipfile.ZipFile(zipsrc)
for member in zfile.infolist():
target_path = os.path.join(TARGETDIR, member.filename)
if target_path.endswith('/'): # folder entry, create
try:
os.makedirs(target_path)
except (OSError, IOError) as err:
# Windows may complain if the folders already exist
if err.errno != errno.EEXIST:
raise
continue
with open(target_path, 'wb') as outfile, zfile.open(member) as infile:
shutil.copyfileobj(infile, outfile)
При этом используется shutil.copyfileobj()
для эффективного чтения данных из открытого объекта zipfile и их копирования в выходной файл.