Kompato

In-Memory Zip in Python

I recently noticed that there is a for-pay component available to zip files in-memory with Python. Considering this is something that should be free, I threw together the following code. It has only gone through very basic testing, so if anyone finds any errors, let me know and I'll update this.

import zipfile
import StringIO

class InMemoryZip(object):
def __init__(self):
# Create the in-memory file-like object
self.in_memory_zip = StringIO.StringIO()

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

def writetofile(self, filename):
'''Writes the in-memory zip to a file.'''
f = file(filename, "w")
f.write(self.read())
f.close()

if __name__ == "__main__":
# Run a test
imz = InMemoryZip()
imz.append("test.txt", "Another test").append("test2.txt", "Still another")
imz.writetofile("test.zip")
Filed under: development python

In-Memory Zip in Python

I recently noticed that there is a for-pay component available to zip files in-memory with Python. Considering this is something that should be free, I threw together the following code. It has only gone through very basic testing, so if anyone finds any errors, let me know and I'll update this.

import zipfile
import StringIO

class InMemoryZip(object):
   def __init__(self):
       # Create the in-memory file-like object
       self.in_memory_zip = StringIO.StringIO()
      
   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()
  
   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("test.txt", "Another test").append("test2.txt", "Still another")
   imz.writetofile("test.zip")

2012-02-07 UPDATE: Changed file(filename, "w") to file(filename, "wb"). Thanks to Andrei Damian-Fekete for pointing that out.

Filed under: development python
11
To Posterous, Love Metalab