如何修复S3每日UTC文件夹创建代码的ServiceResource属性错误?
解决AWS S3按UTC每日创建文件夹并存储JSON的问题
问题根源
你遇到的报错是因为boto3的ServiceResource对象并不提供head_bucket和head_object方法——这两个方法属于boto3.client('s3')客户端实例的API。ServiceResource是面向对象的封装模式,和直接调用原生API的Client操作逻辑完全不同。
优化后可运行代码
下面是修正后的完整代码,实现按UTC日期创建文件夹(S3中通过前缀模拟)、上传JSON字典的功能:
import json import boto3 from datetime import datetime from botocore.exceptions import ClientError # 初始化S3资源 s3 = boto3.resource('s3') # 配置参数,替换为你的桶名和业务数据 BUCKET_NAME = 'your-bucket-name' DATA_DICT = {'key1': 'value1', 'key2': ['item1', 'item2'], 'utc_timestamp': datetime.utcnow().isoformat()} # 生成UTC日期格式的文件夹前缀(S3无真实文件夹,靠前缀模拟) utc_date_folder = datetime.utcnow().strftime('%Y-%m-%d') # 构造目标对象键 target_key = f"{utc_date_folder}/data.json" def check_bucket_exists(bucket_name): """检查S3桶是否存在""" try: bucket = s3.Bucket(bucket_name) bucket.load() # ServiceResource模式下等效于head_bucket return True except ClientError as e: error_code = e.response['Error']['Code'] if error_code == '404': return False else: # 权限不足等其他错误直接抛出 raise def upload_json_to_s3(bucket_name, key, data_dict): """将字典转为JSON并上传到S3""" json_str = json.dumps(data_dict, indent=2) try: s3.Object(bucket_name, key).put(Body=json_str, ContentType='application/json') print(f"JSON文件已成功上传至s3://{bucket_name}/{key}") except ClientError as e: print(f"上传失败:{e}") raise # 执行流程 if check_bucket_exists(BUCKET_NAME): upload_json_to_s3(BUCKET_NAME, target_key, DATA_DICT) else: print(f"桶 {BUCKET_NAME} 不存在,请先创建该桶")
关键说明
- S3文件夹本质:S3没有真实的文件夹结构,所谓的“文件夹”是通过对象键的前缀实现的。上传
2024-05-20/data.json时,S3会自动识别前缀2024-05-20/为文件夹展示。 - 桶存在性检查:用
Bucket.load()替代head_bucket,这是ServiceResource模式下的标准做法,通过捕获ClientError判断桶是否存在。 - JSON上传:将字典转为格式化的JSON字符串,指定
ContentType='application/json'确保S3识别文件类型,方便后续访问或解析。
内容的提问来源于stack exchange,提问作者Khaned
相关产品推荐
相关产品推荐

