2012-06-06 14 views
29

Come estrarre un zip in memoria?Estrarre un file zip in memoria?

Il mio tentativo (ritorno None su .getvalue()):

from zipfile import ZipFile 
from StringIO import StringIO 

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

Vedi anche: https://stackoverflow.com/questions/5710867 – J0ANMM

risposta

42

extractall estratti al file system, in modo da non ottenere quello che vuoi. Per estrarre un file in memoria, utilizzare il metodo read.

Se si ha realmente bisogno l'intero contenuto in memoria, si potrebbe fare qualcosa di simile:

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

motivi probabili:

modulo

1.This attualmente non gestire i file ZIP multi-disco. (OR)
2.Controllare con StringIO.getvalue() errore Unicode meteo in arrivo.

+0

Codice [ 'extractall'] (http://docs.python.org/ library/zipfile # zipfile.ZipFile.extractall) non restituisce nulla (beh, 'None' di default), ed è quello che ottiene. – mata

11

Lavorando frequentemente con l'archivio, suggerirei di creare uno strumento per lavorare in modo confortevole con gli archivi in ​​memoria. Qualcosa di simile a questo:

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") 

funziona come un fascino