Estoy tratando de encontrar la mejor manera de comprimir una secuencia con Python's zlib
.Python: ¿Cómo crear un archivo gzip'd en tiempo real?
Tengo una corriente de tipo fichero de entrada (input
, abajo) y una función de salida que acepta un tipo fichero (output_function
, más adelante):
with open("file") as input:
output_function(input)
Y me gustaría gzip- comprimir input
trozos antes de enviarlos a output_function
:
with open("file") as input:
output_function(gzip_stream(input))
parece que el módulo gzip asume que la entrada o la salida será un archivo en el disco gzip ... Así que supongo que laEl móduloes lo que quiero.
Sin embargo, no ofrece de forma nativa una forma simple de crear un archivo de flujo como ... Y la compresión de flujo que admite viene agregando datos manualmente a un búfer de compresión y luego vaciando ese búfer.
Por supuesto, podría escribir una envoltura alrededor de zlib.Compress.compress
y zlib.Compress.flush
(Compress
se devuelve por zlib.compressobj()
), pero estaría preocupado por conseguir búfer tamaños incorrectos, o algo similar.
Entonces, ¿cuál es la forma más sencilla de crear un archivo comprimido gzip-como archivo comprimido con Python?
Editar: Para aclarar, el flujo de entrada y el flujo de salida comprimido son a la vez demasiado grande para caber en la memoria, así que algo como output_function(StringIO(zlib.compress(input.read())))
en realidad no resuelve el problema.
He encontrado una implementación de lo opuesto, un archivo como descomprimir una secuencia gzip'd en effbot: http://effbot.org/librarybook/zlib.htm ... Pero estoy buscando por el contrario (aunque supongo que podría ser útil si tengo que escribir el mío) –