如何简化AWS S3 GEFS数据下载代码并指定存储目录?
简化AWS S3 GEFS数据批量下载代码
核心目标
消除冗余代码,实现预报时效000-384的批量下载,并将文件保存到以存储桶名noaa-gefs-pds命名的本地目录。
简化后代码(Python + boto3)
import boto3 from pathlib import Path # 配置参数(根据实际需求修改) BUCKET_NAME = "noaa-gefs-pds" # GEFS数据的S3前缀示例,替换为你需要的日期、集合类型等 S3_PREFIX = "gefs.20240520/00/atmos/pgrb2ap5/gec00.t00z.pgrb2a.0p50.f" LOCAL_BASE_DIR = Path("./") / BUCKET_NAME # 初始化S3客户端(默认读取本地AWS凭证,或通过参数指定) s3 = boto3.client("s3") # 创建本地目标目录 LOCAL_BASE_DIR.mkdir(parents=True, exist_ok=True) # 循环遍历预报时效000到384(步长通常为3,可根据需求调整) for fhour in range(0, 385, 3): # 生成三位格式的预报时效字符串(如000、003...384) fhour_str = f"{fhour:03d}" s3_key = f"{S3_PREFIX}{fhour_str}" local_file_path = LOCAL_BASE_DIR / s3_key.split("/")[-1] try: # 下载文件 s3.download_file(BUCKET_NAME, s3_key, str(local_file_path)) print(f"已下载: {local_file_path}") except s3.exceptions.NoSuchKey: print(f"文件不存在,跳过: {s3_key}") except Exception as e: print(f"下载失败 {s3_key}: {str(e)}")
代码简化说明
- 消除冗余:用
range()循环替代重复的单文件下载代码,仅需维护核心参数 - 动态生成路径:通过格式化字符串自动生成三位格式的预报时效,避免手动拼接每个文件名
- 自动目录管理:用
pathlib自动创建目标目录(含父目录),无需手动操作 - 异常处理:针对S3文件不存在、网络错误等情况做捕获,避免程序崩溃
- 可扩展性:修改
S3_PREFIX或循环步长(如改为6小时)即可适配不同GEFS数据集合
注意事项
- 确保已安装依赖:
pip install boto3 - 配置AWS凭证:可通过
~/.aws/credentials文件、环境变量或IAM角色(如果在EC2/ECS上运行) - 调整循环步长:GEFS预报时效通常每3小时更新一次,若需其他间隔可修改
range()的第三个参数
内容的提问来源于stack exchange,提问作者William Jacondino
相关产品推荐
相关产品推荐

