動作中に出力を tar.bz2 ファイルに保存するプログラムがあります。そのデータを処理する python スクリプトがあります。
最初のプログラムが中断された場合、またはプロセスの進行中に python スクリプトを実行するだけで、出力を処理できるようにしたいと考えています。
もちろん、最後の bzip2 ブロックは未完成であるため、読み取ることはできません。実際には破損していますが、実際には切り詰められているだけです。GNU tar は実際には、その時点までのファイルから可能な限りすべてを喜んで抽出しますbzcat
。bzip2recover
修復されたブロックを作成することもできますが、この場合はbzcat
.
しかし、私は Python の標準のtarfileモジュールを使用しようとしています。これは失敗します
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
最初にあることがわかってTarFile.extractfile
いるファイルで使用しようとしたとき。(問題なく抽出されます。)tar -xf tarfile.tar.bz2 filename
ファイルの無効な終わりを無視して、私が持っているものを操作するために私ができる賢いことはありますか?
データセットはかなり大きくなる可能性があり、非常に圧縮可能であるため、圧縮しないままにしておくことは望ましくありません。
(既存の質問Untar archive in Python with errorsを見つけましたが、その場合、ユーザーはos.system
tar ファイルを試みています。)