2011-12-14 25 views
63

¿Cómo comprime gzip una cadena en Python?¿Cómo comprime gzip una cadena en Python?

gzip.GzipFile existe, pero eso es para los objetos de archivo: ¿qué pasa con las cadenas simples?

+7

primer resultado para 'python gzip' http://docs.python.org/library/gzip.html (¿podría probar un poco?) – KevinDTimm

+0

@KevinDTimm, ese docu solo menciona 'StringIO' pero no realmente no explica cómo hacerlo. Entonces, hacer esa pregunta aquí es completamente válido, en mi humilde opinión. Sin embargo, algunas pruebas más antes de preguntar y contarnos sobre ellas hubieran sido agradables. – Alfe

+0

@Alfe - la pregunta se cerró hace 4 años por la misma razón que mi comentario - el OP no hizo ningún esfuerzo para buscar primero. – KevinDTimm

Respuesta

2

Elija un módulo adecuado de http://docs.python.org/library/archiving.html - ya sea gzip o zlib, según sus necesidades exactas.

+1

Veo que zlib tiene varios niveles de compresión. ¿Cuál es el nivel que usa gzip? – bellpeace

+2

bellpeace, ¿siguió el enlace a la documentación de gzip? "El argumento de nivel de compresión es un número entero de 1 a 9 que controla el nivel de compresión; 1 es el más rápido y produce la menor compresión, y el 9 es el más lento y produce la mayor compresión. El valor predeterminado es [ELIMINADO]". Te dejaré verificar el valor real tú mismo. :) –

+0

El valor predeterminado es 9, el más lento. –

52

La forma más sencilla es la zlibencoding:

compressed_value = s.encode("zlib") 

A continuación, descomprimirlo con:

plain_string_again = compressed_value.decode("zlib") 
+3

es s la cadena? – dcousens

+1

@Daniel: Sí, 's' es un objeto de Python 2.x de tipo' str'. –

+2

Ver [Codificaciones estándar] (http://docs.python.org/2/library/codecs.html#standard-encodings) para donde lo obtuvo (desplácese hacia abajo a __ "códecs" __). También disponible: 's.encode ('rot13')', 's.encode ('base64')' – bobobobo

123

Si se quiere producir un gzip cadena binaria compatible completo, con la cabecera, etc, puede usar gzip.GzipFile junto con StringIO:

import StringIO 
import gzip 
out = StringIO.StringIO() 
with gzip.GzipFile(fileobj=out, mode="w") as f: 
    f.write("This is mike number one, isn't this a lot of fun?") 
out.getvalue() 

# returns '\x1f\x8b\x08\x00\xbd\xbe\xe8N\x02\xff\x0b\xc9\xc8,V\x00\xa2\xdc\xcc\xecT\x85\xbc\xd2\xdc\xa4\xd4"\x85\xfc\xbcT\x1d\xa0X\x9ez\x89B\tH:Q!\'\xbfD!?M!\xad4\xcf\x1e\x00w\xd4\xea\xf41\x00\x00\x00' 
+4

Ahorro de vida. Simplemente impresionante. Sé que esto es viejo, ¡pero gracias! –

+15

Esta debería ser la respuesta aceptada. – ForeverWintr

+2

Lo contrario de esto es: 'def gunzip_text (texto): infile = StringIO.StringIO() infile.write (texto) con gzip.GzipFile (fileobj = infile, modo = "r") como f: f .rewind() f.read() return out.getvalue() – fastmultiplication

-5
s = "a long string of characters" 

g = gzip.open('gzipfilename.gz', 'w', 5) # ('filename', 'read/write mode', compression level) 
g.write(s) 
g.close() 
+3

Supongo que la pregunta era sobre la compresión de una cadena en la memoria sin tener que escribirla en el disco en el proceso. De lo contrario, tu respuesta es totalmente correcta. – Alfe

Cuestiones relacionadas