2012-06-06 13 views
29

मैं स्मृति में ज़िप कैसे निकालें?स्मृति के लिए एक ज़िपफाइल निकालने?

मेरे प्रयास (.getvalue() पर None लौटने): फाइल सिस्टम के लिए

from zipfile import ZipFile 
from StringIO import StringIO 

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

यह भी देखें: https://stackoverflow.com/questions/5710867 – J0ANMM

उत्तर

42

extractall अर्क, ताकि आप आप क्या चाहते हैं नहीं मिलेगा। स्मृति में फ़ाइल निकालने के लिए, read विधि का उपयोग करें।

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

संभावित कारण हैं::

1. इस मॉड्यूल वर्तमान में बहु-डिस्क ज़िप फ़ाइलों को संभालने नहीं है

तुम सच में स्मृति में पूरी सामग्री की जरूरत है, तो आप की तरह कुछ कर सकता है। (OR)
2. StringIO.getvalue() मौसम के साथ जांच करें यूनिकोड त्रुटि आ रही है।

+0

नहीं। [ 'extractall'] (http://docs.python.org/ लाइब्रेरी/ज़िपफाइल # zipfile.ZipFile.extractall) कुछ भी वापस नहीं करता है (ठीक है, डिफ़ॉल्ट रूप से 'कोई नहीं'), और यही वह है जो वह प्राप्त करता है। – mata

11

संग्रह के साथ अक्सर काम करना मैं मेमोरी अभिलेखागार के साथ आराम से काम करने के लिए एक उपकरण बनाने की सिफारिश करता हूं। कुछ इस तरह: एक आकर्षण की तरह

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

काम करता है

संबंधित मुद्दे