Python TarFile с данными bz2

Я пытаюсь загрузить сжатый tar-файл bz2 и создать из него объект 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 вручную, он работает с 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>]
>>> 

Я пытался оптимизировать, так как tarfile должен поддерживать сжатие bz2.


person tMC    schedule 30.08.2011    source источник


Ответы (1)


Я только что просмотрел tarfile.py в своих системах. Номера строк были совсем другими (у меня 2.6), так что я предполагаю, что после 2.4 была тяжелая работа.

Возможно, в модуле была ошибка в 2,4 раза, которая была исправлена, или указанный интерфейс изменился, поэтому документы больше не соответствуют вашей версии модуля.

Однако это всего лишь предположение.

person glglgl    schedule 30.08.2011
comment
Да, он отлично работает (после удаления этого материала MyModule). - person glglgl; 01.09.2011