最近在下一些.nc文件,但下载的时候服务器并没有把文件大小传过来,也无法断点续传。对下载到的文件到底有没有下完整,无法判定。同时也想到以前帮师兄下一些数据的时候也遇到过这个问题,但当时也没有注意,直接就把数据交过去了,导致师兄后期在用数据的时候才发现有些文件没有下完整。
今天又研究了一番hdf文件,发现文件大小其实是已经写到文件里了,hdf文件的第40到第44个字节记录了文件的大小。所以想到了一个简单的办法:根据文件自身记录的大小与实际下载到的大小进行比较,相等视为下载完整;不一样则删除重新下载。python代码如下:
# Check hdf4 file by comparing sizes
import os,struct,glob
for file in glob.glob('*.nc'):
f = open(file,'rb')
data = f.read(40)
data = f.read(4)
int_size = struct .unpack('i',data)[0]
act_size = os.path.getsize(file)
f.close()
if int_size!=act_size:
print('{} is truncted should be = {} actual = {}'.format(file,int_size,act_size))
os.remove(file)
else:
#print(file,int_size,act_size)
pass
input('Any key to continue...')
理论上来说,文件大小相等不等于文件没有损坏,而hdf文件是不具备纠错和自检功能的。搜索的时候发现,有人根据hdf其他的一些特性来校验文件,比如Check HDF5 files for corruption,不过这个就等后续改进吧。当下暂且以文件大小来检验。