Python TarFile 与 bz2 数据

2 投票
1 回答
776 浏览
提问于 2025-04-17 00:45

我正在尝试下载一个经过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 个回答

0

我刚刚看了一下我系统上的 tarfile.py 文件。因为我用的是2.6版本,所以行号和别人的差别很大,这让我觉得自从2.4版本以来可能进行了很多改动。

也许在2.4版本的时候,这个模块有个bug被修复了,或者说的接口发生了变化,所以文档和你现在用的模块版本不再匹配了。

不过这只是我的猜测。

撰写回答