Как можно избежать: "Экземпляр ZipFile не имеет атрибута __exit__" при извлечении zip-файла?
Код является:
import sys
execfile('test.py')
В test.py у меня есть:
import zipfile
with zipfile.ZipFile('test.jar', 'r') as z:
z.extractall("C:\testfolder")
Этот код производит:
AttributeError ( ZipFile instance has no attribute '__exit__' ) # edited
Код из "test.py" работает при запуске из режима ожидания Python. Я использую Python v2.7.10
2 ответа
Привет, может быть, поздно, но я просто решил эту ошибку для меня:).
Я делаю свой код на Python 2.7, но когда я помещаю его на моем сервере, который использует 2.6, у меня появляется эта ошибка:
AttributeError: ZipFile instance has no attribute '__exit__'
Для решения этой проблемы я использую ответ Себастьяна на этот пост: заставить работать код Python 2.7 с Python 2.6
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 делает именно то, что должен делать отсутствующий метод выхода в ZipFile. А именно, вызвать метод close
С уважением, (извините за мой английский)
Согласно документации Python, ZipFile.extractall()
был добавлен в версии 2.6. Я ожидаю, что вы обнаружите, что вы используете другую, более старую (до 2.6) версию Python, чем та, которую использует простоя. Вы можете узнать, какая версия с этим:
import sys
print sys.version
и местоположение работающего переводчика может быть получено с
print sys.executable
Название вашего вопроса подтверждает вероятность того, что старая версия Python выполняется, потому что with
операторы выражения / контекста (классы с __exit__()
метод) не были введены до 2.6 (хорошо 2.5, если явно включен).