2012-06-06 21 views
29

¿Cómo extraigo un zip en la memoria?Extrayendo un archivo zip en la memoria?

Mi intento (volviendo None en .getvalue()):

from zipfile import ZipFile 
from StringIO import StringIO 

def extract_zip(input_zip): 
    return StringIO(ZipFile(input_zip).extractall()) 
+0

Ver también: https://stackoverflow.com/questions/5710867 – J0ANMM

Respuesta

42

extractall extractos al sistema de archivos, por lo que no obtendrá lo que desea. Para extraer un archivo en la memoria, use el método read.

Si realmente necesita el contenido completo de la memoria, podría hacer algo como:

def extract_zip(input_zip): 
    input_zip=ZipFile(input_zip) 
    return {name: input_zip.read(name) for name in input_zip.namelist()} 
-3

razones probables:

módulo

1. Este no tiene actualmente manejar archivos ZIP de discos múltiples. (O)
2.Compruebe con StringIO.getvalue() tiempo Se acerca el error Unicode.

+0

Nº [ 'extractall'] (http://docs.python.org/ library/zipfile # zipfile.ZipFile.extractall) no devuelve nada (bueno, 'None' por defecto), y eso es lo que obtiene. – mata

11

Trabajando con frecuencia con archivos, recomendaría hacer una herramienta para trabajar cómodamente con archivos en memoria. Algo como esto:

import zipfile 
import StringIO 

class InMemoryZip(object): 

    def __init__(self): 
     # Create the in-memory file-like object for working w/imz 
     self.in_memory_zip = StringIO.StringIO() 

    # Just zip it, zip it 
    def append(self, filename_in_zip, file_contents): 
     # Appends a file with name filename_in_zip and contents of 
     # file_contents to the in-memory zip. 
     # Get a handle to the in-memory zip in append mode 
     zf = zipfile.ZipFile(self.in_memory_zip, "a", zipfile.ZIP_DEFLATED, False) 

     # Write the file to the in-memory zip 
     zf.writestr(filename_in_zip, file_contents) 

     # Mark the files as having been created on Windows so that 
     # Unix permissions are not inferred as 0000 
     for zfile in zf.filelist: 
      zfile.create_system = 0  

     return self 

    def read(self): 
     # Returns a string with the contents of the in-memory zip. 
     self.in_memory_zip.seek(0) 
     return self.in_memory_zip.read() 

    # Zip it, zip it, zip it 
    def writetofile(self, filename): 
     # Writes the in-memory zip to a file. 
     f = file(filename, "wb") 
     f.write(self.read()) 
     f.close() 

if __name__ == "__main__": 
# Run a test 
    imz = InMemoryZip() 
    imz.append("testfile.txt", "Make a test").append("testfile2.txt", "And another one") 
    imz.writetofile("testfile.zip") 

funciona como un encanto

Cuestiones relacionadas