在Python中处理损坏的归档文件
我有一个文件压缩和解压缩的系统,首先我会检查文件是否已经被压缩。如果没有压缩,我就会把这个文件压缩成一个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)