2012-02-29 4 views
4

출력이 tar.bz2 파일에 저장되는 프로그램이 있습니다. 그 데이터를 처리하는 python 스크립트가 있습니다.파이썬에서 손상된 tar.bz2 파일을 읽으려면 어떻게해야합니까?

첫 번째 프로그램이 중단되면 출력 작업을하고 싶습니다. 또는 프로세스가 진행되는 동안 python 스크립트를 실행하면됩니다.

물론 최종 bzip2 블록은 미완성이므로 읽을 수는 없습니다. 실제로 잘려나 갔지만 실제로는 손상되었습니다. GNU tar는 사실상 그 시점까지 파일의 모든 것을 행복하게 추출 할 것입니다 - 그 문제는 bzcat입니다. 그리고 bzip2recover은 수리 된 블록을 만들 수 있습니다.이 경우 실제로는 덜 유용합니다 (bzcat).

하지만 파이썬 표준 인 tarfile 모듈을 사용하려고합니다. 내가 처음에 알고 파일에 TarFile.extractfile을 사용하려고 할 때

File "/usr/lib64/python2.7/tarfile.py", line 2110, in extractfile 
    tarinfo = self.getmember(member) 
    File "/usr/lib64/python2.7/tarfile.py", line 1792, in getmember 
    tarinfo = self._getmember(name) 
    File "/usr/lib64/python2.7/tarfile.py", line 2361, in _getmember 
    members = self.getmembers() 
    File "/usr/lib64/python2.7/tarfile.py", line 1803, in getmembers 
    self._load()  # all members, we first have to 
    File "/usr/lib64/python2.7/tarfile.py", line 2384, in _load 
    tarinfo = self.next() 
    File "/usr/lib64/python2.7/tarfile.py", line 2319, in next 
    self.fileobj.seek(self.offset) 
EOFError: compressed file ended before the logical end-of-stream was detected 

실패합니다. (tar -xf tarfile.tar.bz2 filename은 잘 추출됩니다.)

파일의 유효하지 않은 끝 부분을 무시하고 내가 가지고있는 것을 사용하면 영리한 방법이 있습니까?

데이터 세트가 상당히 커질 수 있으며 압축률이 매우 높기 때문에 압축되지 않은 상태로 유지하는 것은 바람직하지 않습니다.

는 (I은 기존의 질문 Untar archive in Python with errors을 찾았지만,이 경우, 사용자는 os.system에 tar 파일을 시도하고있다.)

답변

1

이 가능성이있는 것 같습니다. 첫째, 가장 가능성 :

ignore_zeros가 False 인 경우 빈 블록을 아카이브의 끝으로 처리하십시오. 참이면 빈 (및 유효하지 않은) 블록을 건너 뛰고 을 가능한 한 많은 구성원으로 만드십시오. 이는 아카이브가 연결되었거나 손상된 경우에만 유용합니다. 둘째

: 특수 목적

는 모드에 대한 제 2 포맷이있다 : "파일 모드 | [압축]. tarfile.open()은 데이터를 블록 스트림으로 처리하는 TarFile 객체를 반환합니다. 파일을 임의로 탐색하지 않습니다. 주어진 경우 fileobj는 mode에 따라 read() 또는 write() 메소드가있는 객체 일 수 있습니다. bufsize는 블록 크기를 지정하고 기본값은 20 * 512 바이트입니다. 이 변형을 예 : sys.stdin, 소켓 파일 객체 또는 테이프 장치. 그러나 이러한 TarFile 객체는 무작위로 액세스 할 수 없으므로 제한적입니다.

파일이 불완전한 경우 파일을 스트림으로 액세스하는 것과 같은 소리가 유용 할 수 있습니다.

+0

감사합니다. 나는 그것을 시도 할 것이지만, 그것은 내 코드를 재고 할 필요가있을 것이다. 분명히'extractfile' 그리고 그 줄을 반복하여 뒤로 탐색을합니다. – mattdm