Как стримить с ZipFile? Как застегнуть "на лету"? - PullRequest
1 голос
/ 04 апреля 2019

Я хочу сжать поток и вывести результат. Я делаю это с помощью AWS Lambda, что имеет значение в смысле доступного дискового пространства и других ограничений. Я собираюсь использовать сжатый поток для записи объекта AWS S3, используя upload_fileobj() или put(), если это имеет значение.

Я могу создать архив в виде файла, пока у меня нет маленьких объектов:

import zipfile
zf = zipfile.ZipFile("/tmp/byte.zip", "w")
zf.writestr(filename, my_stream.read())
zf.close()

Для большого количества данных я могу создать объект вместо файла:

from io import BytesIO
...
byte = BytesIO()
zf = zipfile.ZipFile(byte, "w")
....

но как я могу передать сжатый поток на выход? Если я использую zf.close() - поток будет закрыт, если я его не использую - архив будет неполным.

1 Ответ

2 голосов
/ 04 апреля 2019

Возможно, вы захотите попробовать zipstream версию zipfile.Например, чтобы сжать стандартный ввод в стандартный вывод в виде zip-файла, содержащего данные в виде файла с именем TheLogFile, с использованием итераторов:

#!/usr/bin/python3
import sys, zipstream
with zipstream.ZipFile(mode='w', compression=zipstream.ZIP_DEFLATED) as z:
    z.write_iter('TheLogFile', sys.stdin.buffer)
    for chunk in z:
        sys.stdout.buffer.write(chunk)
...