Python TarFile与bz2数据

时间:2011-08-30 20:24:12

标签: python tarfile

我试图下载bz2压缩tarfile并从中创建一个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 个答案:

答案 0 :(得分:0)

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

也许该模块有2.4次错误已被更正,或者所述界面已更改,因此文档不再与您的模块版本匹配。

然而,这只是猜测。