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

使用boto3复制S3文件至目标Bucket指定前缀路径时出错求助

问题:使用boto3复制S3文件时触发类型错误

场景与代码

我正在使用boto3操作两个S3存储桶:

  • 源存储桶:final-files
  • 目标存储桶:exchange-files
  • 目标桶指定前缀:timed/0001
  • 待复制文件的Key:final_file[-1](已提前赋值,为文件名)

需求是将源桶中的单个文件复制到目标桶的指定前缀路径下,当前代码如下:

# 创建指定待复制对象的源字典
copy_source = {
    'Bucket': 'final-files',
    'Key': final_file[-1] 
}
bucket = s3.Bucket('exchange-files')
prefix="timed/0001"
bucket.copy(copy_source, prefix + key)

# 打印复制完成信息
print('Single File is copied')

运行后触发错误:

"errorMessage": "expected string or bytes-like object, got 's3.Bucket'"

问题原因及修复方案

错误根源

你混淆了boto3资源(s3.Bucket)和客户端(s3.Client)的API用法:

  • s3.Bucket.copy()方法的第一个参数要求是字符串格式的源对象路径(格式为源桶名/对象Key),而非字典格式的copy_source;
  • 字典格式的copy_source是给客户端的copy_object()方法使用的。

另外代码中存在变量不一致问题:你注释里说明key = final_file[-1],但代码直接使用key变量,需确保该变量已正确赋值(当前报错并非由此导致)。

修复后的代码

方案1:使用s3.Bucket的copy方法

调整源参数为字符串格式:

# 构造字符串格式的源对象路径
copy_source = f'final-files/{final_file[-1]}'
bucket = s3.Bucket('exchange-files')
prefix = "timed/0001"
# 正确拼接目标Key,添加分隔符避免路径错误
dest_key = f"{prefix}/{final_file[-1]}"

bucket.copy(copy_source, dest_key)
print('单个文件已复制完成')

方案2:使用s3.Client的copy_object方法(推荐)

该方法支持字典格式的copy_source,参数逻辑更清晰:

import boto3

# 初始化S3客户端
s3_client = boto3.client('s3')

copy_source = {
    'Bucket': 'final-files',
    'Key': final_file[-1] 
}
prefix = "timed/0001"
dest_key = f"{prefix}/{final_file[-1]}"

s3_client.copy_object(
    Bucket='exchange-files',
    Key=dest_key,
    CopySource=copy_source
)

print('单个文件已复制完成')

注意事项

  • 路径拼接时必须添加/分隔符,避免出现timed/0001filename这类无效路径;
  • 确认final_file[-1]是有效的对象Key,无多余前缀或分隔符;
  • 确保已正确初始化boto3的资源或客户端(比如通过boto3.resource('s3')或boto3.client('s3'))。

内容的提问来源于stack exchange,提问作者DataGuy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 08:40:30