我有这个简单的python函数,可以提取zip文件(独立于平台)
def unzip(source, target):
with zipfile.ZipFile(source , "r") as z:
z.extractall(target)
print "Extracted : " + source + " to: " + target
这在Python 2.7中运行良好,但在Python 2.6中失败:
AttributeError: ZipFile instance has no attribute '__exit__':
我发现这个建议需要升级2.6 - > 2.7 https://bugs.launchpad.net/horizon/+bug/955994
但是可以将上面的代码移植到Python 2.6并且仍然保持跨平台吗?
答案 0 :(得分:15)
怎么样:
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
确实完成了__exit__
上缺少的ZipFile
方法应该做的事情。即,调用close
方法
答案 1 :(得分:1)
zipfile模块在python版本2.7.1中更改:
我通过不使用上下文管理器来解决同样的问题"使用" for python 2.6
newzip = None
try:
newzip = zipfile.ZipFile(_file + ".zip", "w", zipfile.ZIP_DEFLATED)
newzip.write(_file)
finally:
newzip.close()
with context manager防止资源泄漏,所以在Python 2.6中我至少仍然建议尝试/ finally来关闭资源。