使用requests下载HDF文件后无法用pyhdf读取的问题求助
解决requests下载HDF文件后无法用pyhdf读取的问题
问题核心原因
你的代码存在两个致命问题,导致下载的并非有效HDF文件:
- 变量顺序错误:调用
requests.get(url)时,url变量还未赋值,实际请求的是未定义的内容(即便后续给url赋值,也不会修正之前的请求)。 - 请求地址错误:你指定的
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
相关产品推荐
相关产品推荐

