我有一个程序可以将其输出保存到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文件。)
答案 0 :(得分:1)
似乎有两种可能性。首先,最有可能的是:
如果ignore_zeros为False,则将空块视为结尾 存档。如果为True,则跳过空(和无效)块并尝试获取 尽可能多的成员。这仅适用于阅读 连锁或损坏的档案。
其次:
出于特殊目的,模式还有第二种格式:'filemode | [compression]'。 tarfile.open()将返回一个TarFile对象,该对象将其数据作为块流进行处理。不会对文件进行随机搜索。如果给定,fileobj可以是具有read()或write()方法的任何对象(取决于模式)。 bufsize指定块大小,默认为20 * 512字节。将此变体与例如sys.stdin,套接字文件对象或磁带设备。但是,这样的TarFile对象受到限制,因为它不允许随机访问
听起来像访问文件,因为当文件不完整时,流可能很有用。