使用Python 2.6运行Python 2.7代码

时间:2014-01-21 20:30:49

标签: python python-2.7 compatibility python-2.6

我有这个简单的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并且仍然保持跨平台吗?

2 个答案:

答案 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中更改:

  • 如果使用模式' a'创建文件。或者' w'然后没有关闭 将任何文件添加到存档,适当的ZIP结构 空档案将写入档案。
  • ZipFile也是一个上下文管理器,因此支持 言。

我通过不使用上下文管理器来解决同样的问题"使用" 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来关闭资源。