Как в контексте управлять BytesIO для нескольких файлов zip?
Я пытаюсь использовать менеджер контекста для потока BytesIO при создании нескольких файлов zip. Я не могу найти способ "сбросить" объект BytesIO после записи первого zip-файла, поэтому я могу использовать тот же объект BytesIO для создания следующего zip-файла. Я всегда получаю сообщение об ошибке "Не удается открыть файл... как архив" при попытке открыть второй zip-файл после его записи на диск. Первый почтовый файл открывается просто отлично. Я искал и не могу найти решение. Смена режимов с записи на добавление тоже не помогла. Я, конечно, могу повторно инициализировать новый объект BytesIO, но это побеждает менеджер контекста. Ниже приведен код, который я думал, должен работать. Я использую Anaconda Python 3.6.6 на Windows 10.
import io
import os
import zipfile
with io.BytesIO() as bytes_io:
with zipfile.ZipFile(bytes_io, mode='w') as zf:
filecount = 0
for item in os.scandir(r'C:\Users\stephen\Documents'):
if not item.is_dir():
zf.write(item.path, item.name)
filecount += 1
if filecount % 3 == 0:
with open(r'C:\Users\stephen\Documents\\' + str(filecount // 3) + '.zip', 'wb') as f:
f.write(bytes_io.getvalue())
bytes_io.seek(0)
bytes_io.truncate()
1 ответ
Вы можете использовать то же самое BytesIO
объект, но вы должны создать новый ZipFile
объект для каждого zip-файла, который вы хотите создать:
with io.BytesIO() as bytes_io:
filecount = 0
for item in os.scandir(r'C:\Users\stephen\Documents'):
if not item.is_dir():
with zipfile.ZipFile(bytes_io, mode='w') as zf:
zf.write(item.path, item.name)
filecount += 1
if filecount % 3 == 0:
with open(r'C:\Users\stephen\Documents\\' + str(filecount // 3) + '.zip', 'wb') as f:
f.write(bytes_io.getvalue())
bytes_io.seek(0)
bytes_io.truncate()