我有一個程序,它的輸出保存到一個tar.bz2文件,因爲它的工作原理。我有一個處理該數據的Python腳本。如何從Python中損壞的tar.bz2文件中讀取數據?
我希望能夠處理輸出,如果第一個程序中斷 - 或者只是在進程正在進行時對其運行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文件。)
謝謝。我會嘗試,但它需要重新考慮我的代碼。顯然'extractfile'然後遍歷這些行會產生向後搜索。 – mattdm 2012-02-29 01:48:58