Making Python 2.7 code run with Python 2.6

淺唱寂寞╮ 提交于 2019-11-28 07:27:59

问题


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?


回答1:


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




回答2:


zipfile module Changed in python version 2.7.1:

  • If the file is created with mode 'a' or 'w' and then closed without adding any files to the archive, the appropriate ZIP structures for an empty archive will be written to the file.
  • ZipFile is also a context manager and therefore supports the with statement.

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.



来源:https://stackoverflow.com/questions/21268470/making-python-2-7-code-run-with-python-2-6

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!