我有以下代码来打开.tgz文件,但我得到 tarfile.ReadError:文件无法成功打开。
fp = tarfile.open('file.tgz', 'r')
print fp.list()
fp.close()
我可以使用" tar -xvzf file.tgz提取此存档。"显然它与文件的创建方式有关,因为当我使用file
比较两个不同的.tgz文件时,我看到了一个区别; file2.tgz适用于这段代码。
$ file file.tgz
file.tgz: gzip compressed data, from FAT filesystem (MS-DOS, OS/2, NT)
$ file file2.tgz
file2.tgz: gzip compressed data, was "", last modified: Tue Aug 19 11:16:10 2014, max compression
任何想法为什么会发生这种情况或如何修改file.tgz以便它与tarfile一起使用?
注意:我使用的是Python 2.7.5。
答案 0 :(得分:0)
在我的情况下,文件被 double 压缩。我按照罗伯的建议尝试gzip -l --verbose file.gz
,发现关键提示是压缩率是负数。
method crc date time compressed uncompressed ratio uncompressed_name
defla 8448d70e Jul 1 11:34 11176 11146 -0.3% output.gz
正在运行tar -xvf output.gz
且未存档,没有问题。但是Python的tarfile似乎认为它已损坏:
import tarfile
tarfile.open('output.gz', 'r:gz') # throws invalid header error
这是因为tar似乎可以处理多个级别的压缩。如果您一次解压缩,它应该可以工作:
import tarfile
import gzip
import shutil
with gzip.open('output.gz') as g:
with open('output2.gz', 'wb') as f_out:
shutil.copyfileobj(g, f_out)
tarfile.open('output2.gz', 'r:gz') # <tarfile.TarFile object at 0x109152690>
现在压缩率看起来不错:
gzip -l --verbose output*
method crc date time compressed uncompressed ratio uncompressed_name
defla 8448d70e Jul 1 11:34 11176 11146 -0.3% output
defla 76e69d8c Jul 1 11:37 11146 44032 74.6% output2