Extracting a zipfile to memory?

前端 未结 3 1004
刺人心
刺人心 2020-11-30 02:58

How do I extract a zip to memory?

My attempt (returning None on .getvalue()):

from zipfile import ZipFile
from StringIO imp         


        
相关标签:
3条回答
  • Probable reasons:

    1.This module does not currently handle multi-disk ZIP files. (OR)
    2.Check with StringIO.getvalue() weather Unicode Error is coming up.

    0 讨论(0)
  • 2020-11-30 03:27

    Frequently working with in-memory archives in Python 2 I would recommend making a tool. Something like this:

    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")
    
    0 讨论(0)
  • 2020-11-30 03:42

    extractall extracts to the file system, so you won't get what you want. To extract a file in memory, use the ZipFile.read() method.

    If you really need the full content in memory, you could do something like:

    def extract_zip(input_zip):
        input_zip=ZipFile(input_zip)
        return {name: input_zip.read(name) for name in input_zip.namelist()}
    
    0 讨论(0)
提交回复
热议问题