从Amazon S3下载NOAA影像瓦片失败求助:Python生成空文件
解决NOAA S3影像瓦片下载后文件为空的问题
问题根源分析
你当前的代码存在两个核心问题:
- S3客户端未正确关联密钥:代码中定义了
ACCESS_KEY和SECRET_KEY,但创建s3客户端时未传入这些凭证,导致boto3无法完成权限验证,下载请求实际未成功执行。 - 重复执行下载操作:同时调用
download_file和download_fileobj,前者已负责将文件写入本地,若前面请求失败,后者会覆盖写入空内容。
另外,NOAA的这个S3桶是公开可读的,无需密钥即可访问,使用无效密钥反而会触发权限错误。
修正后的代码方案
方案1:匿名访问公开桶(推荐)
直接创建无凭证的S3客户端,针对公开桶进行访问:
import os import boto3 from botocore.config import Config # 创建适配公开桶的匿名S3客户端 s3 = boto3.client('s3', config=Config(signature_version='s3v4')) bucket = 'noaa-eri-pds' # 单瓦片示例,后续可扩展为循环批量下载 key = '2023_Pre_Event/GC2301b_OB_N_RGB/GC2301b_OB_N_C0805830w250600n.tif' filename = 'GC2301b_OB_N_C0805830w250600n.tif' localfilename = os.path.join('E:/PythonSandbox/Amazon_AWS/', filename) # 自动创建本地目标目录(若不存在) os.makedirs(os.path.dirname(localfilename), exist_ok=True) # 执行下载并捕获异常 try: s3.download_file(bucket, key, localfilename) print(f"文件 {filename} 下载完成") except Exception as e: print(f"下载失败:{str(e)}")
方案2:使用有效密钥访问(若你有合法凭证)
确保密钥拥有该桶的s3:GetObject权限,同时正确初始化客户端:
import os import boto3 ACCESS_KEY = '你的真实Access Key' SECRET_KEY = '你的真实Secret Key' # 传入密钥初始化S3客户端 s3 = boto3.client( 's3', aws_access_key_id=ACCESS_KEY, aws_secret_access_key=SECRET_KEY ) bucket = 'noaa-eri-pds' key = '2023_Pre_Event/GC2301b_OB_N_RGB/GC2301b_OB_N_C0805830w250600n.tif' filename = 'GC2301b_OB_N_C0805830w250600n.tif' localfilename = os.path.join('E:/PythonSandbox/Amazon_AWS/', filename) os.makedirs(os.path.dirname(localfilename), exist_ok=True) try: s3.download_file(bucket, key, localfilename) print(f"文件 {filename} 下载完成") except Exception as e: print(f"下载失败:{str(e)}")
额外注意事项
- 批量下载时建议添加请求间隔或重试机制,避免触发S3的请求频率限制。
- 若仍出现空文件,可通过捕获的异常信息排查具体问题(如密钥无效、文件路径错误、对象不存在等)。
内容的提问来源于stack exchange,提问作者Ken Gaines
相关产品推荐
相关产品推荐

