2011-08-30 5 views
2

bz2 압축 된 tar 파일을 다운로드하고 tarfile.TarFile 개체를 만들려고합니다.bz2 데이터가있는 Python 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) 당신은 파일 name=에 찬성 사용 fileobj=를 사용하는 경우. 그것은 여전히 ​​null 파일에 액세스하려고하는 것처럼 보입니까?

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.open()를 사용하지 않고 내가 BZ2 데이터 압축을 풀고 tarfile.Tarfile 객체가 수동으로이 StringIOfileobj와 함께 작동 만들 경우 위치 0

에 있어야하는데 tarfile이 bz2 압축을 지원한다고 가정하기 때문에 합리화를 시도합니다.

답변

0

내 시스템에서 tarfile.py을 조사했습니다. 라인 번호는 상당히 다르기 때문에 (2.6을가집니다) 2.4 이후로 많은 작업이 있었다고 가정합니다.

모듈에 수정 된 버그가 있었거나 해당 인터페이스가 변경되어 모듈이 더 이상 모듈 버전과 일치하지 않을 수 있습니다.

그러나 그것은 단지 추측입니다.

+0

2.6에서이 구문을 사용할 수 있습니까? – agf

+0

예, 완벽하게 작동합니다 (MyModule을 제거한 후). – glglgl

관련 문제