【问题标题】:tarfile.ReadError: file could not be opened successfullytarfile.ReadError:文件无法成功打开
【发布时间】:2014-10-22 12:20:34
【问题描述】:

我有以下代码可以打开一个 .tgz 文件,但是我得到 tarfile.ReadError: file could not be open successfully

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。

【问题讨论】:

  • 你下载了吗?你检查过它的校验和/哈希是否正常?
  • 您是如何将file.tgz 从您的 Windows 机器传输到您的 Linux 机器的?尝试gzip -t file.tgz 测试文件完整性。
  • @CristianoAraujo 我可以在我的 Mac 上使用 tar 提取,所以我假设文件是​​好的。我无权访问生成文件以检查 MD5 总和的机器或人员。
  • @Robᵩ $ gzip -t file.tgz 不产生任何输出。我猜这意味着文件没有问题。
  • 我不知道为什么会出现这个错误。我会在 Mac 上使用 tar 提取文件,在 Mac 上使用 tar 创建一个新图像,然后在新图像上运行我的 python 程序。

标签: python tarfile


【解决方案1】:

在我的例子中,文件是 double 压缩的。我按照 Rob 的建议尝试了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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-08
    • 2019-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多