Python读取NDACC的HDF文件时遇文件打开错误,求助解决及数据导出方案
Python读取NDACC的HDF文件时遇文件打开错误,求助解决及数据导出方案
看起来你在处理NDACC的HDF文件时踩了好几个典型的坑,我来帮你一步步理清解决思路:
一、先搞定文件打不开的核心问题
首先先排查几个最容易忽略的小细节:
- 先确认路径绝对正确:很多时候“文件不存在”的报错都是相对路径的锅!你可以先在脚本里加两行代码验证:
如果输出是import os print("当前工作目录:", os.getcwd()) print("文件是否存在:", os.path.exists('Data/groundbased_ftir.hdf'))False,要么是你写的路径错了,要么是当前工作目录根本不是你放脚本的那个文件夹——直接换成文件的绝对路径(比如C:/Users/你的用户名/Documents/Data/groundbased_ftir.hdf或者/home/你的用户名/Data/groundbased_ftir.hdf)肯定不会错。 - 搞清楚HDF的版本:这是关键!你用h5py报错“File signature not found”,是因为NDACC的很多HDF文件是HDF4格式,而h5py只支持HDF5格式,认不出HDF4的文件头,自然就报错了。这也是为什么IDL能打开——IDL对HDF4的支持本来就比Python的基础库好。
那Python里读HDF4得用专门的库,推荐两个常用的:
方法1:用pyhdf库(专门针对HDF4)
先装库:pip install pyhdf,然后试试这个代码:
from pyhdf.SD import SD, SDC # 换成你的文件绝对路径 file_path = "/完整的绝对路径/groundbased_ftir.hdf" # 打开文件 hdf_file = SD(file_path, SDC.READ) # 先看看文件里有哪些数据集,方便你找自己要的内容 print("文件里的所有数据集:", hdf_file.datasets().keys()) # 比如读取某个叫"target_dataset"的数据集(换成你实际看到的名称) target_data = hdf_file.select("target_dataset") data = target_data.get() # 看看数据的基本信息 print("数据形状:", data.shape) print("前5行数据:", data[:5])
方法2:用netCDF4库(部分NDACC的HDF4兼容netCDF接口)
如果pyhdf装不上或者读不了,试试netCDF4:pip install netCDF4,代码示例:
from netCDF4 import Dataset file_path = "/完整的绝对路径/groundbased_ftir.hdf" nc_file = Dataset(file_path, 'r') # 查看所有可读取的变量 print("所有变量名称:", list(nc_file.variables.keys())) # 读取指定变量 var_data = nc_file.variables["你的变量名"][:] print(var_data)
另外,你之前用pandas的read_hdf完全不适用这个场景——pandas的read_hdf只能读pandas自己生成的HDF文件,根本读不了这种科学领域的HDF4/HDF5数据,所以别再用这个方法啦。
二、把数据导出成CSV的方法
当你成功读到数据之后,转CSV就很简单了,用pandas帮忙就行:
import pandas as pd # 假设你已经读到了核心数据data,还有对应的时间、经纬度等辅助数据 # 先把数据整理成字典形式(键是CSV的列名,值是对应的数据) data_dict = { "时间": time_array, "观测值": data.flatten(), # 如果是多维数组,先展平成一维,或者按维度拆分 "纬度": lat_array, "经度": lon_array } # 转成DataFrame df = pd.DataFrame(data_dict) # 导出成CSV df.to_csv("ndacc_ftir_data.csv", index=False, encoding="utf-8")
如果你的数据是多维的(比如随时间和高度变化),可以根据需求把数据拆分成多行,或者保留多维结构存成CSV(不过CSV一般是二维的,建议拆成二维表格再存)。
三、如果还是想用IDL导出数据的补充
既然你已经能在IDL里打开文件,那直接在IDL里转CSV也很方便:
- 先查看文件里的数据集:
hdf_id = HDF_OPEN('groundbased_ftir.hdf') HDF_SD_GETINFO, hdf_id, DATASETS=dataset_names PRINT, '所有数据集:', dataset_names - 读取你要的数据集:
data = HDF_SD_READ(hdf_id, '你要的数据集名称') - 导出成CSV:
; 直接导出数据,如果需要表头可以先把表头和数据拼起来 WRITE_CSV, 'idl_exported_data.csv', data, DELIMITER=','
备注:内容来源于stack exchange,提问作者Ara
相关产品推荐
相关产品推荐

