Я пытаюсь найти лучший способ сжать поток с помощью Python zlib
.
У меня есть файловый поток ввода (input
, ниже) и функция вывода, которая принимает файлоподобный (output_function
, ниже):
with open("file") as input:
output_function(input)
И я бы хотел сжать куски input
перед отправкой их на output_function
:
with open("file") as input:
output_function(gzip_stream(input))
Похоже, что модуль gzip предполагает, что вход или выход будет gzip'd-файлом-на-диске ... Поэтому я предполагаю, что модуль zlib - это то, что Я хочу.
Однако изначально он не предлагает простой способ создания потокового файла, похожего на… И сжатие потока, которое он поддерживает, происходит путем ручного добавления данных в буфер сжатия, а затем очистки этого буфера.
Конечно, я мог бы написать обертку вокруг zlib.Compress.compress
и zlib.Compress.flush
(Compress
возвращается zlib.compressobj()
), но я бы беспокоился о неправильном размере буфера или о чем-то подобном.
Итак, как проще всего создать потоковый файл с сжатием gzip в Python?
Редактировать : Чтобы уточнить, входной поток и сжатый выходной поток слишком велики для размещения в памяти, поэтому что-то вроде output_function(StringIO(zlib.compress(input.read())))
на самом деле не решает проблему.