Python TarFile с данными bz2 - PullRequest
       5

Python TarFile с данными bz2

2 голосов
/ 31 августа 2011

Я пытаюсь загрузить сжатый 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= он используется в пользуfile name=. Хотя, похоже, он все еще пытается получить доступ к пустому файлу?

Если указан fileobj, он используется в качестве альтернативы объекту file, открытому для имени.находиться в позиции 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.

1 Ответ

0 голосов
/ 31 августа 2011

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

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

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

...