4

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

4

1 回答 1

1

似乎有2种可能。首先,也是最有可能的:

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

第二:

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

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

于 2012-02-29T01:44:55.940 回答