Reputation: 327
I have this simply python function that can extract a zip file (platform independent)
def unzip(source, target):
with zipfile.ZipFile(source , "r") as z:
z.extractall(target)
print "Extracted : " + source + " to: " + target
This runs fine with Python 2.7 but fails with Python 2.6:
AttributeError: ZipFile instance has no attribute '__exit__':
I found this suggestions that an upgrade is required 2.6 -> 2.7 https://bugs.launchpad.net/horizon/+bug/955994
But is it possible to port the above code to work with Python 2.6 and still keep it cross platform?
Upvotes: 8
Views: 5687
Reputation: 19243
zipfile module Changed in python version 2.7.1:
I solved same problem by not using context manager "with" for python 2.6
newzip = None
try:
newzip = zipfile.ZipFile(_file + ".zip", "w", zipfile.ZIP_DEFLATED)
newzip.write(_file)
finally:
newzip.close()
The with context manager protects against resource leaks, so in Python 2.6 I would at least still recommend a try/finally to close the resource.
Upvotes: 1
Reputation: 9696
What about:
import contextlib
def unzip(source, target):
with contextlib.closing(zipfile.ZipFile(source , "r")) as z:
z.extractall(target)
print "Extracted : " + source + " to: " + target
contextlib.closing
does exactly what the missing __exit__
method on the ZipFile
would be supposed to do. Namely, call the close
method
Upvotes: 16