在Python中处理损坏的归档文件

0 投票
1 回答
3324 浏览
提问于 2025-04-18 09:52

我有一个文件压缩和解压缩的系统,首先我会检查文件是否已经被压缩。如果没有压缩,我就会把这个文件压缩成一个tar归档文件(tar.gz)。然后,把压缩后的归档文件上传到服务器。上传后,服务器会解压这个文件,并对其进行一些处理。

问题出现在压缩服务在压缩文件的过程中突然关闭。这会导致tar归档文件损坏。

....
tar = tarfile.open(compress_file_name, "w:gz")
tar.add(file_path, arcname=file_name)
tar.close()
....

为了检查文件的完整性,我尝试了

try:
    f = tarfile.open(file_path) # This should throw CRC error but its not
except Exception, e:
    raise e

但实际上,Python似乎可以正常打开这个文件。为了确认文件是否真的没问题,我尝试用命令 tar -xvzf <corrupted_archive> 来解压这个文件,结果我得到了

[~/]$ tar -xvzf <corrupted_archive>

gzip: stdin: not in gzip format
tar: Child returned status 1
tar: Error is not recoverable: exiting now

现在我可以在Python中使用相同的过程,调用 subprocess.call(['tar','-xvzf',archive_name]) 来解压,但我其实想要一种更符合Python风格的方法来验证文件的完整性。

任何帮助都会非常感谢。

1 个回答

5

打开这个文件不会出现错误,除非文件的头部有问题。你需要把整个文件都读一遍,才能发现错误。这个文件是tar.gz格式也没关系,因为GZIP(.gz)部分的CRC校验码应该能帮助你找到错误(希望如此):

import gzip

with gzip.open(file_path) as g:
    try:
        while g.read(1024 * 1024):
            pass
    except IOError as e:
        print("Corrupted!", e)

撰写回答