当前位置:首页>python>1个Python脚本,快速摸清NetCDF文件所有信息(附完整源码)

1个Python脚本,快速摸清NetCDF文件所有信息(附完整源码)

  • 2026-09-05 17:05:59
1个Python脚本,快速摸清NetCDF文件所有信息(附完整源码)

一、前言

从事气象观测、预报、科研的相工作者,每天都要和 NetCDF文件打交道——ERA5再分析数据、FY系列卫星数据、地面观测同化数据等大都以NetCDF格式存储。

但每次拿到NetCDF数据,都要写零散代码调试,才能摸清「经纬度范围、时间维度、要素变量」这些关键信息,尤其是处理批量数据时,重复操作耗时又易错。

今天给大家分享1个Python脚本,一键即可视化NetCDF文件所有核心信息,新手也能直接上手,帮助大家节省大量数据预处理时间!

二、效果预览:

以「ERA5 reanalysis-era5-pressure-levels 」NetCDF数据为例,展示脚本输出效果:

1.维度信息输出:自动识别lon(经度)、lat(纬度)、time(时间)维度,计算经纬度范围和间隔。

2. 全局属性输出:快速提取气象数据关键元信息,无需打开专业软件查看,直接确认数据合法性和来源。

3. 变量信息输出:清晰展示变量的核心信息,尤其是单位、缺失值,直接决定后续数据处理方式。

三、完整源码

第一步:安装依赖库

打开Anaconda Prompt(或终端),执行以下命令:

pip install netCDF4pip install tabulate

第二步:复制完整源码

新建一个Python文件(命名为nc_info.py),复制以下源码到文件中保存 ,无需修改任何内容。

# This Python file uses the following encoding: utf-8# 作者:black_lang# 创建时间:2026/2/5# 文件名:nc_info.pyimport netCDF4 as ncfrom tabulate import tabulateimport sysimport numpy as npdef visualize_nc_info(file_path):    """    可视化nc文件的核心信息    :param file_path: nc文件路径    """    try:        table_format="grid"        # 1. 打开nc文件        ds = nc.Dataset(file_path, mode='r')        print(f"========== NETCDF 文件信息概览 ==========\n"              f"文件路径: {file_path}\n"              f"文件格式: {ds.file_format}\n")        # 2. 展示维度信息        print("【1. 维度信息】")        dim_data = []        for dim_name, dim in ds.dimensions.items():            dim_type = "无限维度"if dim.isunlimited() else"有限维度"            dim_min = "-"            dim_max = "-"            dim_interval = "-"            if dim_name in ds.variables:                coord_var = ds.variables[dim_name]                if dim.size > 0andnot dim.isunlimited():                    try:                        coord_data = coord_var[:]                        if isinstance(coord_data, np.ma.MaskedArray):                            coord_data = coord_data.compressed()                          if len(coord_data) >= 2:                            dim_min = round(np.min(coord_data), 4)                            dim_max = round(np.max(coord_data), 4)                            diffs = np.diff(coord_data)                            if np.allclose(diffs, diffs[0]):                                dim_interval = round(diffs[0], 4)                            else:                                dim_interval = "不等距"                    except Exception as e:                        pass            dim_data.append([                dim_name, dim.size, dim_type,                 dim_min, dim_max, dim_interval            ])        # 生成维度表格        dim_headers = ["维度名", "维度大小", "维度类型",                        "维度最小值", "维度最大值", "维度间隔"]        print(            tabulate(                dim_data, headers=dim_headers,                 tablefmt=table_format        ), "\n")        # 3. 展示全局属性        print("【2. 全局属性】")        global_attr_data = []        for attr_name in ds.ncattrs():            attr_value = ds.getncattr(attr_name)            if isinstance(attr_value, str) and len(attr_value) > 50:                attr_value = attr_value[:50] + "..."            global_attr_data.append([attr_name, attr_value])        if global_attr_data:            global_headers = ["属性名", "属性值"]            print(tabulate(                global_attr_data, headers=global_headers,                tablefmt=table_format            ), "\n")        else:            print("该文件无全局属性\n")        # 4. 展示变量信息(含变量属性)        print("【3. 变量信息(含属性)】")        var_list = list(ds.variables.keys())        ifnot var_list:            print("该文件无变量")            ds.close()            return        for idx, var_name in enumerate(var_list, 1):            var = ds.variables[var_name]            print(f"\n\n├─ 变量 {idx}: {var_name}")            basic_data = [                ["数据类型", var.dtype],                ["关联维度", var.dimensions],                ["数据形状", var.shape],                ["是否为坐标变量", var_name in ds.dimensions]            ]            basic_headers = ["基础信息项", "值"]            print(tabulate(                basic_data, headers=basic_headers,                 tablefmt=table_format            ))            # 变量属性表格            print(f"└─ 变量 {var_name} 的属性:")            var_attr_data = []            for attr_name in var.ncattrs():                attr_value = var.getncattr(attr_name)                if isinstance(attr_value, str) and len(attr_value) > 50:                    attr_value = attr_value[:50] + "..."                var_attr_data.append([attr_name, attr_value])            if var_attr_data:                var_attr_headers = ["属性名", "属性值"]                print(tabulate(                    var_attr_data, headers=var_attr_headers,                     tablefmt=table_format                ))            else:                print("该变量无属性")        # 关闭文件        ds.close()    except FileNotFoundError:        print(f"错误:未找到文件 {file_path}")    except Exception as e:        print(f"解析文件时出错:{str(e)}")if __name__ == "__main__":    nc_file_path = sys.argv[1]    visualize_nc_info(nc_file_path)

在控制台输入命令,替换NetCDF路径,按住回车就可输出文件信息,有需要NetCDF示例文件的伙伴可后台私信戳我。

python nc_info.py ./era5_data.nc(NetCDF文件路径)

四、最后

无论是日常业务中的数据核查、批量数据处理,还是科研中的数据预处理、这款脚本都能帮大家节省大量时间,避免重复劳动。

觉得有用的话,别忘了点赞、转发,分享给身边的人哦~

最新文章

随机文章