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

如何修复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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 07:22:53