# 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)