使用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
相关产品推荐
相关产品推荐

