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

从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 17:44:52