Выполнение кода Python 2.7 с помощью 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 ответа

Решение

Как насчет:

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 метод

Модуль zipfile Изменен в python версии 2.7.1:

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

Я решил ту же проблему, не используя менеджер контекста "с" для Python 2.6

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

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

Другие вопросы по тегам