ecl*_*ark 5 python gzip netcdf
我有一个工作的python程序,它使用netCDF4模块中的Dataset命令读入大量的netCDF文件.以下是相关部分的片段:
from netCDF4 import Dataset
import glob
infile_root = 'start_of_file_name_'
for infile in sorted(glob.iglob(infile_root + '*')):
ncin = Dataset(infile,'r')
ncin.close()
Run Code Online (Sandbox Code Playgroud)
我想修改它以读取gzip压缩的netCDF文件.文件本身在创建后进行了压缩; 它们不是内部压缩的(即文件是*.nc.gz).如果我正在阅读gzip压缩文本文件,那么命令将是:
from netCDF4 import Dataset
import glob
import gzip
infile_root = 'start_of_file_name_'
for infile in sorted(glob.iglob(infile_root + '*.gz')):
f = gzip.open(infile, 'rb')
file_content = f.read()
f.close()
Run Code Online (Sandbox Code Playgroud)
在谷歌搜索大约半小时并阅读netCDF4文档后,我能够为netCDF文件做到这一点的唯一方法是:
from netCDF4 import Dataset
import glob
import os
infile_root = 'start_of_file_name_'
for infile in sorted(glob.iglob(infile_root + '*.gz')):
os.system('gzip -d ' + infile)
ncin = Dataset(infile[:-3],'r')
ncin.close()
os.system('gzip ' + infile[:-3])
Run Code Online (Sandbox Code Playgroud)
是否可以直接使用数据集命令读取gzip文件?或者没有通过os调用gzip?
从 netCDF4-1.2.8 ( Changelog ) 开始支持从内存中读取数据集:
import netCDF4
import gzip
with gzip.open('test.nc.gz') as gz:
with netCDF4.Dataset('dummy', mode='r', memory=gz.read()) as nc:
print(nc.variables)
Run Code Online (Sandbox Code Playgroud)
因为NetCDF4-Python包装了C NetCDF4库,所以只要使用gzip模块传入类文件对象就不行了.正如@tdelaney所建议的那样,唯一的选择是使用gzip提取到临时文件.
如果您碰巧对这些文件的创建有任何控制,NetCDF版本4文件在内部支持zlib压缩,因此使用gzip是多余的.如果需要重复处理这些文件,也可能需要将文件从版本3转换为版本4.