莫明地从一个远程服务器上下载csv.gz文件,可能会因为网络原因,下载的文件不完整,而文件数理又比较多,每个文件压缩包又比较大(大约1GB左右),此时就需要对gz文件的完整性做校验。
当然最简单且最可靠的办法是gzip -t xxx.csv.gz,不过这个办法很慢。
用python实现方法如下:
import os
import gzip
def check_integrity(local_file):
if local_file.endswith('.gz'):
with gzip.open(local_file, 'rb') as f:
try:
f.seek(-1, os.SEEK_END)
except:
return -1
return 0
注意:这里使用的是gzip.open,所以f.seek()并非普通的seek,而是解压结果中seek,所以有任何不完整的问题,f.seek()就会抛出异常。
注意:测试发现,使用如上python代码,比调用gzip -t命令,要慢近2倍。
考虑到是因为下载过程中,网络中断导致的网络不完整,有一种速度非常快,但是不一定完全靠谱的判断方法,就是判断文件最末尾是不是\x00结尾,可以一定程度上检查出问题:
def check_integrity(local_file):
if local_file.endswith('.gz'):
with open(local_file, 'rb') as f:
f.seek(-1, os.SEEK_END)
if f.read() != b'\x00':
return -1
return 0