The zipfile module is fairly flexible but there are occasions when you cannot pass it a filename (as a string) or a file like object; for example the open method on AWS S3 buckets does not return a suitable object. What to do if you can read the zip file into memory – writing it to disk just to read it back in again seems a waste.
Python, as is often the case, already has a module to solve this problem, in this case StringIO. This allows you to treat a string, or in this case the entire file in memory, as if it was a file.
This allows us to write our unzip procedure compactly as
# module imports and S3 connection omitted for brevity (and beyond scope) s3file = s3connection.get_bucket(bucketname).get_key(filename) if s3file: s3file.open() zf = udbfile.read() s3file.close() zip = zipfile.ZipFile(StringIO.StringIO(zf)) zip.extractall()