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

使用requests下载HDF文件后无法用pyhdf读取的问题求助

解决requests下载HDF文件后无法用pyhdf读取的问题

问题核心原因

你的代码存在两个致命问题,导致下载的并非有效HDF文件:

  1. 变量顺序错误:调用requests.get(url)时,url变量还未赋值,实际请求的是未定义的内容(即便后续给url赋值,也不会修正之前的请求)。
  2. 请求地址错误:你指定的url是目录地址,而非具体的HDF文件链接,因此requests下载的是该目录的网页HTML代码,而非目标HDF文件——这就是pyhdf报错的根本原因:你试图用HDF解析器读取HTML文件。

修正后的可运行代码

import requests
from pyhdf.SD import SD, SDC

# 替换为具体的HDF文件完整URL,不是目录地址
target_url = 'https://data.seaice.uni-bremen.de/amsr2/asi_daygrid_swath/s3125/2015/jan/McMurdo/asi-AMSR2-s3125-20150101-v5.hdf'

# 发起请求并处理异常
try:
    resp = requests.get(target_url, timeout=30)
    # 检查请求是否成功,避免下载错误页面
    resp.raise_for_status()
except requests.exceptions.RequestException as err:
    print(f"下载失败: {str(err)}")
    exit()

# 写入本地文件
save_file = 'asi-AMSR2-s3125-20150101-v5.hdf'
with open(save_file, 'wb') as f:
    f.write(resp.content)

# 验证文件读取
try:
    hdf_obj = SD(save_file, SDC.READ)
    print("HDF文件读取成功")
    # 可选:打印文件基本信息
    print(f"文件内数据集总数: {hdf_obj.info()[0]}")
    hdf_obj.end()
except Exception as read_err:
    print(f"读取失败: {str(read_err)}")

额外优化建议

  • 核对文件大小:下载完成后,对比手动下载的文件大小与程序下载的文件大小,若差距明显,说明下载不完整或地址仍有误。
  • 大文件流式下载:如果目标HDF文件体积较大,建议使用流式下载减少内存占用:
with requests.get(target_url, stream=True, timeout=30) as resp:
    resp.raise_for_status()
    with open(save_file, 'wb') as f:
        for chunk in resp.iter_content(chunk_size=8192):
            f.write(chunk)
  • 添加请求头:部分网站会拦截无标识的请求,可添加User-Agent模拟浏览器请求:
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'
}
resp = requests.get(target_url, headers=headers, timeout=30)

内容的提问来源于stack exchange,提问作者Liv

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 11:43:12