Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Extracting a zipfile to memory?

How do I extract a zip to memory?

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

from zipfile import ZipFile from StringIO import StringIO  def extract_zip(input_zip):     return StringIO(ZipFile(input_zip).extractall()) 
like image 497
user1438003 Avatar asked Jun 06 '12 05:06

user1438003


People also ask

What happens when you extract a ZIP file?

When you extract files from a zipped folder, a new folder with the same name is created which contains the files. The compressed (zipped) version also remains.


2 Answers

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()} 
like image 126
mata Avatar answered Sep 21 '22 16:09

mata


If you work with in-memory archives frequently, I would recommend making a tool. Something like this:

# Works in Python 2 and 3.  try:     import BytesIO except ImportError:     from io import BytesIO  # Python 3 import zipfile   class InMemoryZip(object):     def __init__(self):         # Create the in-memory file-like object for working w/IMZ         self.in_memory_zip = BytesIO()      # 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 physical file.         with open(filename, "wb") as file:             file.write(self.read())   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")     print("testfile.zip created")  
like image 29
Deviacium Avatar answered Sep 22 '22 16:09

Deviacium