2
我試圖下載一個bz2壓縮tarfile並創建一個tarfile.TarFile
對象。Python TarFile與bz2數據
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壓縮。
這個語法在2.6上適合你嗎? – agf
是的,它完美的工作(刪除後,MyModule的東西)。 – glglgl