2

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=。しかし、それはまだnullファイルにアクセスしようとしているように見えますか?

fileobjが指定されている場合、名前のために開かれたファイルオブジェクトの代わりに使用されます。位置0にあるはずです。

使用せずtarfile.open()、bz2データを解凍してtarfile.Tarfileオブジェクトを手動で作成すると、次のように機能しStringIOますfileobj

>>> 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>]
>>> 

tarfilebz2圧縮をサポートすることになっているので、私は合理化しようとしていました。

4

1 に答える 1

0

私は自分のシステムを調べたtarfile.pyところです。行番号はかなり異なっていたので(私は2.6を持っています)、2.4以降は大変な作業があったと思います。

モジュールに2.4回のバグがあり、修正されたか、前述のインターフェイスが変更されたため、ドキュメントがモジュールのバージョンと一致しなくなった可能性があります。

ただし、これは単なる推測です。

于 2011-08-30T23:25:02.180 に答える