Выполнение кода 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 я бы по крайней мере рекомендовал попробовать / наконец закрыть ресурс.