Python Boto3/S3:使用复制对象重命名对象

Python Boto3/S3:使用复制对象重命名对象,python,amazon-web-services,amazon-s3,boto3,Python,Amazon Web Services,Amazon S3,Boto3,我正在尝试使用python boto3重命名s3存储桶中的一个文件,我无法清楚地理解这些参数。有人能帮我吗 我计划将对象复制到新对象,然后删除实际对象 我在这里发现了类似的问题,但我需要一个使用boto3的解决方案。您不能在S3中重命名对象,因此,正如您所指出的,您需要将其复制到一个新名称,然后删除旧名称: client.copy_object(Bucket="BucketName", CopySource="BucketName/OriginalName", Key="NewName") cl

我正在尝试使用python boto3重命名s3存储桶中的一个文件,我无法清楚地理解这些参数。有人能帮我吗

我计划将对象复制到新对象,然后删除实际对象


我在这里发现了类似的问题,但我需要一个使用boto3的解决方案。

您不能在S3中重命名对象,因此,正如您所指出的,您需要将其复制到一个新名称,然后删除旧名称:

client.copy_object(Bucket="BucketName", CopySource="BucketName/OriginalName", Key="NewName")
client.delete_object(Bucket="BucketName", Key="OriginalName")

我找到了另一个解决办法

s3 = boto3.resource('s3')
s3.Object('my_bucket','new_file_key').copy_from(CopySource='my_bucket/old_file_key')
s3.Object('my_bucket','old_file_key').delete()

该方法更新的Boto3文档中的以下示例也适用于copy_object(),现在似乎是所需的语法:

copy_source = {'Bucket': 'source__bucket', 'Key': 'my_folder/my_file'}
s3.copy_object(CopySource = copy_source, Bucket = 'dest_bucket', Key = 'new_folder/my_file')
s3.delete_object(Bucket = 'source_bucket', Key = 'my_folder/my_file')
上面链接的文档中的注释:

CopySource(dict)——源存储桶的名称、源对象的键名称以及源对象的可选版本ID。字典格式为:{'Bucket':'Bucket','Key':'Key','VersionId':'id'}。请注意,VersionId键是可选的,可以省略


我收到以下错误:botocore.exceptions.ClientError:发生错误(NoSuchBucket)调用CopyObject操作时:指定的bucket不存在我设置bucket='xyz-abc-yzd',其中“xyz-abc-yzd”是我的bucket名称设置bucket name/key时是否遵循任何约定?同一个bucket我可以使用“list_bucket()”列出它可能会为其他用户节省一些时间。
CopySource
参数应包含
BucketName
KeyName
。所以,
OriginalName
不完全是对象键。@Trein-谢谢!我在这里把空气变成蓝色,想知道wtf。参数已经改变了,正如@Trein提到的
CopySource
应具有以下结构:
{'Bucket':'string','Key':'string','VersionId':'string'}
。这是供参考的文件。我喜欢这个解决方案,谢谢。如果有人和我一样跌倒了,给我一个提示。在第一次读取时,我没有注意到传递给CopySource的键包含bucket名称。很酷的一点是,这意味着你可以在两个桶之间进行复制,但我被抛出是因为我只是想在同一个桶中更改一个键,没有想到要预先设置它。当我这样做时,我得到的是权限错误,而不是一个更合理的NoSuchBucket错误。这让我更加困惑!希望大家现在可以跳过这个陷阱。我对CopySource使用了字典格式(字符串格式对我不起作用):
CopySource='string'或{'Bucket':'string','Key':'string','VersionId':'string'}
基于是否可能在复制之前删除了对象?我们如何确保最后两条语句的顺序?唯一的问题是,如果将事件附加到bucket,它将再次触发事件。如果您实际上只想移动文件(真正更改指针位置),这不是效率低下吗?因为这里我们必须复制字节。没有办法仅仅改变ref(即传统的mv操作)吗?我想你指的是
client
而不是
s3
,因为在boto3 v1.9.83
's3.ServiceResource'对象中没有属性“copy\u object”
。看一看@MikA的答案,它正在使用资源复制这个对我有用的东西。s3应该是s3客户端而不是资源