2012-06-06 8 views
29

Wie extrahiere ich eine Zip in den Speicher?Entpacken einer Zip-Datei in den Speicher?

Mein Versuch (Rückkehr None auf .getvalue()):

from zipfile import ZipFile 
from StringIO import StringIO 

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

Siehe auch: https://stackoverflow.com/questions/5710867 – J0ANMM

Antwort

42

extractall Extrakte auf das Dateisystem, so dass Sie nicht bekommen, was Sie wollen. Verwenden Sie die Methode read, um eine Datei im Speicher zu extrahieren.

Wenn Sie wirklich den gesamten Inhalt im Speicher benötigen, können Sie so etwas wie:

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

Mögliche Gründe:

1.This Modul zur Zeit nicht verarbeitet Multi-Disk-ZIP-Dateien. (OR)
2.Überprüfen Sie mit StringIO.getvalue() Wetter Unicode-Fehler steht vor der Tür.

+0

Nr [ 'extractall'] (http://docs.python.org/ library/zipfile # zipfile.ZipFile.extractall) gibt nichts zurück (naja, 'None' standardmäßig), und das ist, was er bekommt. – mata

11

Häufig mit dem Archiv arbeiten würde ich empfehlen, ein Werkzeug für die komfortable Arbeit mit In-Memory-Archiven zu machen. Etwas wie folgt aus:

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

funktioniert wie ein Charme