You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用satpy加载MODIS HDF数据时触发ValueError报错问题咨询

问题原因

该报错本质是Satpy调用底层HDF读取库时,无法识别目标文件为合法的HDF/CDF/NetCDF格式,常见诱因按出现概率排序:

  • 下载的MODIS文件损坏:从Earthdata下载数据时如果网络中断、登录鉴权过期,会导致文件只下载了部分内容,虽然后缀名是.hdf,但内部没有完整的HDF文件结构。
  • 文件实际格式与后缀不匹配:下载时如果没有通过Earthdata的权限校验,服务器会返回HTML格式的登录页/403错误页,这类文件如果被重命名为.hdf后缀,会被读取器误判为HDF文件尝试加载,最终触发格式不识别错误。
  • 读取依赖版本不兼容:Satpy依赖的pyhdf/h5py等底层读取库版本过旧,对部分版本的HDF4格式MODIS文件支持存在缺陷。
  • 文件列表混入不支持的文件:glob匹配时可能把同目录下非MODIS L1B级的HDF文件(比如MYD03几何定位文件、其他卫星产品文件)纳入加载列表,modis_l1b读取器无法解析这类文件也会抛出该错误。
排查解决步骤
  • 验证单文件合法性
    跳过Satpy,直接用底层的pyhdf库加载报错的目标文件,确认文件本身是否可读:
    from pyhdf.SD import SD, SDC
    # 替换为本地报错文件的完整路径
    ds = SD("/MODIS_Aqua/Calibrated_Radiances_5-Min_L1B_1km/MYD021KM.A2017131.1320.061.2018032101913.hdf", SDC.READ)
    print(ds.info())
    
    如果这一步直接报错,可确定问题出在文件本身,和Satpy逻辑无关。
  • 校验文件实际类型与完整性
    • 用文本编辑器打开报错的HDF文件,如果开头是<html>、403 Forbidden、Unauthorized这类文本内容,说明下载到的是Earthdata的权限报错页面,需要重新配置下载鉴权参数后重新获取数据。
    • 到Earthdata对应数据的下载页,找到该文件官方提供的MD5/SHA256校验值,和本地文件的哈希值做比对,数值不一致说明文件下载过程中损坏,重新下载即可。
  • 升级读取依赖
    如果确认文件本身是合法的MODIS HDF文件,执行以下命令升级Satpy及相关读取依赖,修复旧版本的格式兼容问题:
    pip install --upgrade satpy pyhdf h5py netcdf4
    
  • 核对文件列表
    打印filenames_Aqua的全部内容,逐个检查文件名,确保列表内仅包含MYD021KM/MYD02HKM/MYD02QKM这类MODIS L1B级辐射产品,剔除混入的其他类型HDF文件后再尝试加载。

内容的提问来源于stack exchange,提问作者S.Kociok

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.07 16:15:42