从现有NetCDF文件提取变量生成新文件,如何保留原文件压缩率?
嗨,我来帮你搞定这个NetCDF提取变量后文件反而变大的问题!
解决方案:保留原NetCDF压缩格式提取变量
问题根源
你遇到的情况很典型——默认情况下,提取变量并保存新文件时,工具并不会自动继承原文件的压缩配置(比如deflate压缩级别、shuffle过滤器、zlib开关这些)。原5.3MB的文件是经过压缩优化的,而新文件默认用无压缩的方式存储,自然体积就暴涨了。
方法一:用xarray(推荐,代码更简洁)
xarray可以自动读取原文件的编码信息(包括压缩设置),然后在保存新文件时直接复用这些配置,代码非常省心:
import xarray as xr # 打开原NetCDF文件,`decode_times=False`是可选的,避免时间解析问题(根据你的文件情况调整) ds = xr.open_dataset("original_file.nc") # 替换成你要保留的12个变量名 selected_vars = ["var1", "var2", "var3", "..."] ds_selected = ds[selected_vars] # 关键步骤:提取原文件中选中变量的编码配置(包含压缩参数) encoding = {var: ds[var].encoding for var in selected_vars} # 保存新文件,指定encoding参数继承原压缩设置 ds_selected.to_netcdf("compressed_new_file.nc", encoding=encoding)
这段代码会完全复用原文件中每个变量的压缩参数,确保新文件的压缩效率和原文件一致,体积自然会降下来。
方法二:用netCDF4库(更底层,适合精细控制)
如果你习惯用netCDF4直接操作底层,可以手动复制原变量的压缩属性,实现更精细的控制:
from netCDF4 import Dataset # 打开原文件(只读模式)和新文件(写入模式) src = Dataset("original_file.nc", "r") dst = Dataset("compressed_new_file.nc", "w") # 复制原文件的全局属性 dst.setncatts({attr: src.getncattr(attr) for attr in src.ncattrs()}) # 复制所有维度(变量依赖的维度必须先创建) for name, dim in src.dimensions.items(): dst.createDimension(name, len(dim) if not dim.isunlimited() else None) # 替换成你要保留的12个变量名 selected_vars = ["var1", "var2", "..."] for var_name in selected_vars: src_var = src.variables[var_name] # 获取原变量的压缩相关属性 zlib = src_var.zlib if hasattr(src_var, 'zlib') else False complevel = src_var.complevel if hasattr(src_var, 'complevel') else 0 shuffle = src_var.shuffle if hasattr(src_var, 'shuffle') else False # 创建新变量时指定压缩参数 dst_var = dst.createVariable(var_name, src_var.dtype, src_var.dimensions, zlib=zlib, complevel=complevel, shuffle=shuffle) # 复制变量的属性信息 dst_var.setncatts({attr: src_var.getncattr(attr) for attr in src_var.ncattrs()}) # 复制变量数据 dst_var[:] = src_var[:] # 记得关闭文件 src.close() dst.close()
验证效果
保存完成后,你可以用ncdump -h compressed_new_file.nc命令查看新文件的变量属性,确认zlib=True、complevel等参数和原文件一致,此时新文件的体积应该会和预期一样小(甚至比原文件更小,因为变量更少)。
内容的提问来源于stack exchange,提问作者spiceking
相关产品推荐
相关产品推荐

