我尝试使用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关闭它,但它显示了一个错误。怎么了?
谢谢!
您可以使用contextlib.closing,例如:
来自文档:
contextlib.closing
自Python2.5(或者更早的版本)以来就可用了。也许您没有一个足够新的Python标准库版本。看the docs上面写着:
顺便说一下,当您遇到在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“手动”执行。
相关问题 更多 >
编程相关推荐