Python从AWS S3自动下载当日文件夹文件的问题排查
我来帮你解决这个无声失败的问题!这种情况大概率是日期格式和S3文件夹命名不匹配,或者S3对象的筛选逻辑没写对,咱们一步步排查搞定:
1. 先确认S3文件夹的日期格式
这是最容易踩坑的点!你得保证生成的系统日期和S3里的文件夹命名完全一致——比如S3里是2024-05-20/、20240520/还是2024/05/20/?格式差一个字符,脚本都找不到对应的路径。
举个例子,如果S3文件夹是YYYY-MM-DD格式,生成日期变量的代码要这么写:
from datetime import datetime # 生成和S3一致的日期格式,末尾加斜杠(S3的"文件夹"本质是前缀) today = datetime.today().strftime("%Y-%m-%d") prefix = f"{today}/"
2. 用正确的S3 API筛选当日文件
很多人用旧版的list_objects会遇到分页问题,或者没处理前缀的细节。推荐用新版的list_objects_v2,配合分页器处理大量文件,同时加上异常捕获避免无声失败。
给你一个完整的可运行示例:
import boto3 from datetime import datetime import os def download_today_s3_files(bucket_name, local_download_path): # 初始化S3客户端(如果是本地测试,确保已配置AWS凭证) s3 = boto3.client('s3') # 生成当日前缀,根据你的S3文件夹格式调整strftime参数 today = datetime.today().strftime("%Y-%m-%d") prefix = f"{today}/" try: # 用分页器列出对应前缀的所有对象(处理大量文件的情况) paginator = s3.get_paginator('list_objects_v2') page_iterator = paginator.paginate(Bucket=bucket_name, Prefix=prefix) for page in page_iterator: # 检查当日文件夹是否有内容 if 'Contents' not in page: print(f"⚠️ 当日文件夹 {prefix} 下没有文件或文件夹不存在") return for obj in page['Contents']: # 跳过S3里的"文件夹"本身(它是一个空对象) if obj['Key'] == prefix: continue # 构造本地文件路径,保留S3里的子文件夹结构 local_file_path = os.path.join(local_download_path, os.path.relpath(obj['Key'], prefix)) # 创建本地文件夹(如果不存在) os.makedirs(os.path.dirname(local_file_path), exist_ok=True) # 下载文件 print(f"📥 正在下载: {obj['Key']} -> {local_file_path}") s3.download_file(bucket_name, obj['Key'], local_file_path) print("✅ 当日文件下载完成!") except Exception as e: print(f"❌ 执行出错: {str(e)}") # 替换成你的桶名和本地下载路径 if __name__ == "__main__": YOUR_BUCKET = "your-s3-bucket-name" LOCAL_DOWNLOAD_DIR = "./s3-downloads" download_today_s3_files(YOUR_BUCKET, LOCAL_DOWNLOAD_DIR)
3. 排查常见的无声失败原因
- 日期格式不匹配:打印
prefix变量,和S3控制台里的文件夹名称对比,注意S3是大小写敏感的,斜杠也不能少! - 权限问题:如果你的AWS凭证没有
s3:ListBucket或s3:GetObject权限,可能会静默失败——加了上面的try-except就能捕获到权限错误。 - 当日文件夹未生成:脚本会提示“文件夹不存在”,这时候去S3控制台确认当天是否真的生成了目标文件夹。
- 本地路径无写入权限:确保你的本地下载路径有写入权限,否则可能下载失败但没抛出明显错误。
4. 快速验证方法
运行脚本前,先手动打印prefix的值,然后去S3控制台搜索这个前缀,确认存在对应的文件。再运行脚本,看控制台的打印信息,就能清楚是找不到文件夹,还是正在正常下载。
内容的提问来源于stack exchange,提问作者Taukheer
相关产品推荐
相关产品推荐

