如何从Python中读取损坏的tar.bz2文件?

时间:2012-02-29 01:36:13

标签: python bzip2 tarfile corrupt-data

我有一个程序可以将其输出保存到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文件。)

1 个答案:

答案 0 :(得分:1)

似乎有两种可能性。首先,最有可能的是:

  

如果ignore_zeros为False,则将空块视为结尾   存档。如果为True,则跳过空(和无效)块并尝试获取   尽可能多的成员。这仅适用于阅读   连锁或损坏的档案。

其次:

  

出于特殊目的,模式还有第二种格式:'filemode | [compression]'。 tarfile.open()将返回一个TarFile对象,该对象将其数据作为块流进行处理。不会对文件进行随机搜索。如果给定,fileobj可以是具有read()或write()方法的任何对象(取决于模式)。 bufsize指定块大小,默认为20 * 512字节。将此变体与例如sys.stdin,套接字文件对象或磁带设备。但是,这样的TarFile对象受到限制,因为它不允许随机访问

听起来像访问文件,因为当文件不完整时,流可能很有用。