2014-01-21 7 views
8

У меня есть это просто функция питона, который может извлечь почтовый файл (независимо от платформы)Making Python 2.7 код работать с Python 2.6

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

Но можно портировать выше код вр k с Python 2.6 и по-прежнему поддерживать кросс-платформу?

ответ

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

+0

Для контекстного менеджера модулей zipfile «с» поддерживается версия python 2.7.1 https://docs.python.org/2/library/zipfile.html попробуйте без «с» для более старых версий. –

1

ZipFile модуль изменен в питона версии 2.7.1:

  • Если файл создается с режимом «а» или «ж», а затем закрывается без добавления каких-либо файлы в архив, соответствующие ZIP-структуры для пустой файл будет записан в файл.
  • ZipFile также является менеджером контекста и поэтому поддерживает оператор .

я решил такую ​​же проблему, не используя менеджер контекста «с» для питона 2,6

newzip = None 
try: 
    newzip = zipfile.ZipFile(_file + ".zip", "w", zipfile.ZIP_DEFLATED) 
    newzip.write(_file) 
finally: 
    newzip.close() 

с менеджером контекста защищает от утечки ресурсов, поэтому в Python 2.6, я бы по крайней мере, до сих пор рекомендую попробовать/наконец, закрыть ресурс.

+0

Менеджер контекста защищает от утечек ресурсов, поэтому в Python 2.6 я по крайней мере по-прежнему рекомендую попробовать/окончательно закрыть ресурс. – Adam

Смежные вопросы