声明:with和tarfi

2024-09-26 22:09:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试使用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文件并使用语句is关闭它,但它显示了一个错误。怎么了?

谢谢!


Tags: 模块addmostasdirwithtar语句
3条回答

您可以使用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 = '/')

来自文档:

Even if an error occurs, page.close() will be called when the with block is exited.

contextlib.closing自Python2.5(或者更早的版本)以来就可用了。

也许您没有一个足够新的Python标准库版本。看the docs上面写着:

  • 2.7版的新增功能:增加了对上下文管理器协议的支持。

顺便说一下,当您遇到在Python标准库中无法理解的行为时,这些文档应该是您的第一个资源。如果您理解整个“上下文管理”系统(对象协议)是相对较新的,并且可以通过Python中反常的搜索敌对with关键字进行访问,那么阅读该页面将回答您的问题。

这个对象协议实现了一些有用的隐式语义,包括关闭文件、释放锁以及其他清理和资源管理问题。。。即使面对例外。从根本上说,这是围绕try:finally:的语义糖。。。有一些特性可以添加到类中以利用该支持。

要进一步理解这一点,最好阅读:with Statement Context Managers

错误信息被错误复制。它应该读AttributeError: 'TarFile' object has no attribute '__exit__'

显然,您使用的是早于2.7的Python版本,该版本向tarfile模块添加了对“上下文管理器”协议的支持(这是使用with语句所必需的)。

有两种选择:

(1)升级到2.7但要注意,如文档所述,支持不完整:“TarFile对象可以用作with语句中的上下文管理器。当块完成时,它将自动关闭。请注意,如果发生异常,则打开用于写入的存档文件将不会最终确定;只有内部使用的文件对象将被关闭。

(2)停留在2.6或其他什么位置,用try/except/finally“手动”执行。

相关问题 更多 >

    热门问题