带有 bz2 数据的 Python TarFile

Posted

技术标签:

【中文标题】带有 bz2 数据的 Python TarFile【英文标题】:Python TarFile with bz2 data 【发布时间】:2011-08-30 20:24:11 【问题描述】:

我正在尝试下载一个 bz2 压缩的 tar 文件并从中创建一个 tarfile.TarFile 对象。

import MyModule

import StringIO
import tarfile

tardata = StringIO.StringIO()
tardata.write(MyModule.getBz2TarFileData())
tardata.seek(0)

tar = tarfile.open(fileobj = tardata, mode="r:bz2")
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
  File "/usr/lib/python2.4/tarfile.py", line 896, in open
    return func(name, filemode, fileobj)
  File "/usr/lib/python2.4/tarfile.py", line 987, in bz2open
    pre, ext = os.path.splitext(name)
  File "/usr/lib/python2.4/posixpath.py", line 92, in splitext
    i = p.rfind('.')
AttributeError: 'NoneType' object has no attribute 'rfind'

根据文档 (http://docs.python.org/library/tarfile.html#tarfile.open),当您使用 fileobj= 时,它用于支持文件 name=。不过,它似乎仍在尝试访问空文件?

如果指定了 fileobj,则将其用作文件对象的替代项 为名而开。它应该在位置 0。

如果我不使用 tarfile.open() 并且我解压缩 bz2 数据并手动创建 tarfile.Tarfile 对象,它将与 StringIOfileobj 一起使用:

>>> import MyModule
>>> import tarfile
>>> import StringIO
>>> import bz2
>>> tardata = StringIO.StringIO()
>>> tardata.write(bz2.decompress(MyModule.getBz2TarFileData()))
>>> tardata.seek(0)
>>> tar = tarfile.TarFile(fileobj=tardata, mode='r')
>>> tar.getmembers()
[<TarInfo 'FileNumber1' at -0x48e150f4>, <TarInfo 'FileNumber2' at -0x48e150d4>, <TarInfo 'FileNumber3' at -0x48e11fb4>]
>>> 

我正在尝试精简,因为 tarfile 应该支持 bz2 压缩。

【问题讨论】:

【参考方案1】:

我刚刚在我的系统上查看了tarfile.py。行号完全不同(我有 2.6),所以我认为从 2.4 开始就有繁重的工作。

可能该模块在 2.4 版本中存在错误,已更正,或者所述接口已更改,因此文档不再与您的模块版本匹配。

不过,这只是猜测。

【讨论】:

是的,它工作得很好(在删除 MyModule 的东西之后)。

以上是关于带有 bz2 数据的 Python TarFile的主要内容,如果未能解决你的问题,请参考以下文章

Python之tarfile模块的使用

Python tarfile 不会解压

ubuntu 中导 tarfile,win 不亲切

python多卷tar

如何在不添加目录层次结构的情况下使用 Python 将文件添加到 tarfile?

为什么tarfile模块不允许压缩追加?