2011-08-30 92 views
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對象手動它與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壓縮。

回答

0

我剛剛在我的系統上查看了tarfile.py。行號非常不同(我有2.6),所以我認爲自2.4以來有很多工作。

也許該模塊有一個錯誤在2.4倍已被糾正,或者說該接口已經改變,因此該文檔不再與您的模塊版本匹配。

但是,這只是一個猜測。

+0

這個語法在2.6上適合你嗎? – agf

+0

是的,它完美的工作(刪除後,MyModule的東西)。 – glglgl