2009-08-21 12 views
14

que he escrito algo de código Python que recupera un archivo zip de la web y en una cadena:Si tengo el contenido de un archivo zip en una cadena de Python, ¿puedo descomprimirlo sin escribirlo en un archivo?

In [1]: zip_contents[0:5] 
Out[1]: 'PK\x03\x04\x14' 

veo que hay una biblioteca archivo zip, pero estoy teniendo problemas para encontrar una función en ella que pueda solo pase un montón de datos zip sin formato. Parece querer leerlo de un archivo.

¿Realmente necesito descargar esto en un archivo temporal, o hay una forma de evitarlo?

Respuesta

30

zipfile.ZipFile acepta cualquier objeto de tipo fichero, por lo que puede utilizar StringIO (2.x) o BytesIO (3.x):

try: 
    from cStringIO import StringIO 
except: 
    from StringIO import StringIO 
import zipfile 

fp = StringIO('PK\x03\x04\x14') 
zfp = zipfile.ZipFile(fp, "r") 
6

Envuelva su cadena en un objeto cStringIO. Se ve, actúa y grazna como un objeto de archivo, pero reside en la memoria.

-1

Una vez que tenga el objeto zipfile de la respuesta de @ John Millikin anteriormente, puede imprimir el contenido de los archivos contenidos en el zip de esta manera:

file_objects = zfp.infolist() 
contents = [zfp.read(file_object) for file_object in file_objects] 
print(contents) 

que obtendrá algo como esto:

['Content for file 1', 'Content for file 2'] 

Lo usé en una prueba de unidad para afirmar el contenido del archivo zip.

También, StringIO me dio el error: initial_value must be unicode or None, not str, así que usé BytesIO en su lugar.

Cuestiones relacionadas