【发布时间】:2015-12-06 17:56:22
【问题描述】:
我正在尝试使用 python boto3 重命名我的 s3 存储桶中的文件,但我无法清楚地理解这些参数。有人可以帮我吗?
我的计划是将对象复制到一个新对象,然后删除实际对象。
我在这里发现了类似的问题,但我需要使用 boto3 的解决方案。
【问题讨论】:
标签: python amazon-web-services amazon-s3 boto3
我正在尝试使用 python boto3 重命名我的 s3 存储桶中的文件,但我无法清楚地理解这些参数。有人可以帮我吗?
我的计划是将对象复制到一个新对象,然后删除实际对象。
我在这里发现了类似的问题,但我需要使用 boto3 的解决方案。
【问题讨论】:
标签: python amazon-web-services amazon-s3 boto3
您无法重命名 S3 中的对象,因此您需要将其复制为新名称,然后删除旧名称:
client.copy_object(Bucket="BucketName", CopySource="BucketName/OriginalName", Key="NewName")
client.delete_object(Bucket="BucketName", Key="OriginalName")
【讨论】:
CopySource 参数应包含 BucketName 和 KeyName。所以,OriginalName 不完全是对象键。
CopySource 应具有以下结构:{'Bucket': 'string', 'Key': 'string', 'VersionId': 'string'}。这是供参考的文档。 boto3.readthedocs.io/en/latest/reference/services/…
我找到了另一个解决方案
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()
【讨论】:
CopySource='string' or {'Bucket': 'string', 'Key': 'string', 'VersionId': 'string'} 基于 boto3.readthedocs.io/en/latest/reference/services/…
以下示例来自更新的 Boto3 文档中的 copy() 方法,该方法也适用于 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 键是可选的,可以省略。
【讨论】:
client 而不是 s3,因为在 boto3 v1.9.83 's3.ServiceResource' object has no attribute 'copy_object' 中。看看@MikA 的回答,它正在使用资源复制