Как в контексте управлять BytesIO для нескольких zip-файлов? - PullRequest
0 голосов
/ 05 октября 2018

Я пытаюсь использовать менеджер контекста для потока 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 Ответ

0 голосов
/ 05 октября 2018

Вы можете повторно использовать тот же объект 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()
...