Как можно избежать: "Экземпляр 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, если явно включен).

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