Заявление: 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'.