Заявление: with и tarfile
Я пытаюсь использовать оператор with
и модуль tarfile...
with tarfile.open('/dir/dir/dir.tar.gz', 'w:gz') as fl:
fl.add('/dir/dir/dir/', arcname = '/')
Итак, это показывает следующее:
Traceback (most recent call last):
File "", line 1, in
AttributeError: 'TarFile' object has no attribute '__exit__'
Я пытаюсь создать файл tar.gz и закрыть его с помощью оператора, но он показывает ошибку. В чем проблема?
Спасибо!
Ответы
Ответ 1
Вы можете использовать contextlib.closing, например:
from contextlib import closing
with closing(tarfile.open('/dir/dir/dir.tar.gz', 'w:gz')) as fl:
fl.add('/dir/dir/dir/', arcname = '/')
Из документов:
Даже если произошла ошибка, page.close()
будет вызываться при выходе из блока.
contextlib.closing
доступен с Python 2.5 (или, возможно, даже раньше...).
Ответ 2
Возможно, у вас нет достаточно новых версий стандартных библиотек Python. Глядя на документы, в котором говорится:
- Новое в версии 2.7: Добавлена поддержка протокола контекстного менеджера.
Кстати, эти документы должны быть вашим первым приемом, когда вы сталкиваетесь с поведением, которое вы не понимаете ни с чем в стандартных библиотеках Python. Чтение этой страницы, в частности, ответит на ваш вопрос, если вы поймете, что вся система "управления контекстом" (объектный протокол) является относительно новой и доступна через уязвимое ключевое слово with
в Python.
Этот объектный протокол реализует некоторую полезную неявную семантику вокруг закрытия файлов, освобождая блокировки и другие проблемы очистки и управления ресурсами... даже перед исключениями. По сути, это семантический сахар вокруг try:
... finally:
... с некоторыми функциями, которые вы можете добавить к своим классам, чтобы использовать эту поддержку.
Чтобы понять, что дальше вам лучше всего читать: с менеджерами контекста Statement.
Ответ 3
Ваше сообщение об ошибке неправильно скопировано. Это shoulod прочитал AttributeError: 'TarFile' object has no attribute '__exit__'
.
Очевидно, что вы используете версию Python раньше, чем 2.7, которая добавила поддержку протокола "context manager" (который необходим для использования оператора with
) в модуль tarfile
.
Два варианта для вас:
(1) обновление до 2.7 НО обратите внимание на то, что как документально подтверждена поддержка не завершена: "" Объект TarFile может использоваться как менеджер контекста в инструкции с. закрывается, когда блок завершен. Обратите внимание, что в случае исключения архив, открытый для записи, не будет завершен, будет закрыт только внутренний файл файл.
(2) остаться на 2.6 или что-то еще и сделать это "вручную" с помощью try/except/finally.
Ответ 4
Поскольку модуль tarfile явно не реализует API-интерфейс менеджера контекста
http://docs.python.org/release/2.5.2/lib/typecontextmanager.html
Итак, вывод тривиален: вы не можете использовать tarfile с 'with'.