
本文详解在 python 中读取 ndacc 地基 ftir 数据(.hdf 文件)时常见的“file signature not found”或“file does not exist”错误,重点区分 hdf4 与 hdf5 格式,并提供对应库(pyhdf / h5py)、路径验证及数据提取的完整解决方案。
本文详解在 python 中读取 ndacc 地基 ftir 数据(.hdf 文件)时常见的“file signature not found”或“file does not exist”错误,重点区分 hdf4 与 hdf5 格式,并提供对应库(pyhdf / h5py)、路径验证及数据提取的完整解决方案。
NDACC(Network for the Detection of Atmospheric Composition Change)发布的地基傅里叶变换红外光谱(FTIR)数据常以 .hdf 为扩展名,但需特别注意:.hdf 并不等同于 HDF5。该后缀 historically 被 HDF4 和 HDF5 两种不兼容格式共用。若直接使用 h5py 打开实际为 HDF4 格式的文件,将报错 Unable to synchronously open file (File signature not found)——这是因为 h5py 仅支持 HDF5(文件头签名 0x89H 0x48 0x44 0x46 0x0d 0x0a 0x1a 0x0a),而 HDF4 使用完全不同的二进制结构。
✅ 第一步:确认文件真实格式
最可靠的方法是使用命令行工具(Linux/macOS)或 Python 检查文件头:
file Data/ftirfrancenorthhemisphere.hdf # 输出示例: # Data/ftirfrancenorthhemisphere.hdf: Hierarchical Data Format (HDF) version 4 data
或在 Python 中快速探测(无需安装额外依赖):
with open('Data/ftirfrancenorthhemisphere.hdf', 'rb') as f:
header = f.read(4)
print("First 4 bytes (hex):", header.hex())
# HDF4 通常以 b'\x00\x00\x00\x00' 或特定 HDF4 magic 开头;HDF5 必为 b'\x89HDF'
✅ 第二步:选择正确的 Python 库
-
若确认为 HDF5(如 NDACC 新版 NetCDF4/HDF5 封装数据):继续使用
h5py,但务必校验路径:import h5py import os filepath = 'Data/ftirfrancenorthhemisphere.hdf' if not os.path.exists(filepath): raise FileNotFoundError(f"文件未找到:{filepath}。请检查相对路径或改用绝对路径。") with h5py.File(filepath, 'r') as f: print("HDF5 文件键列表:", list(f.keys())) # 示例:读取某个数据集 # data = f['/Spectra/Intensity'][:] -
若确认为 HDF4(NDACC 大量历史 FTIR 数据采用此格式):必须使用
pyhdf:pip install pyhdf
from pyhdf.SD import SD, SDC filepath = 'Data/ftirfrancenorthhemisphere.hdf' try: hdf = SD(filepath, SDC.READ) # 列出所有数据集(SDS)和全局属性 datasets = hdf.datasets() print("HDF4 数据集列表:", list(datasets.keys())) # 读取指定数据集(例如 'Radiance') if 'Radiance' in datasets: sds_obj = hdf.select('Radiance') data = sds_obj.get() # 返回 numpy 数组 attrs = sds_obj.attributes() # 获取单位、缩放因子等元数据 print(f"Radiance 形状: {data.shape}, 类型: {data.dtype}") sds_obj.endaccess() hdf.end() except Exception as e: print(f"HDF4 读取失败:{e}")
⚠️ 关键注意事项:
-
pandas.read_hdf()仅支持 HDF5 格式,且要求文件由pandas.to_hdf()或h5py以特定结构写入(如format='table')。直接传入原始 NDACC HDF4/HDF5 文件会失败,切勿混用。 - 路径错误是高频原因:Python 当前工作目录(
os.getcwd())未必是脚本所在目录。推荐使用pathlib构建健壮路径:from pathlib import Path filepath = Path(__file__).parent / "Data" / "ftirfrancenorthhemisphere.hdf" assert filepath.exists(), f"文件缺失:{filepath}" - 如需导出为 CSV(例如供 Excel 分析):对读取的 numpy 数组使用
pandas.DataFrame(data).to_csv("output.csv", index=False),但注意高维光谱数据通常需先展平或选取切片。
? 总结流程:
- 用
file命令或二进制头检测确认 HDF4/HDF5; - HDF4 →
pyhdf.SD;HDF5 →h5py; - 用
os.path.exists()或pathlib严格验证路径; - 通过
datasets()(HDF4)或f.keys()(HDF5)探索结构,再按需读取; - 导出时优先保留元数据(如波数轴、时间戳),避免信息丢失。
掌握格式辨识与工具匹配,即可稳定解析 NDACC 多源 HDF 数据,为后续光谱分析与可视化奠定基础。










