Boto3/S3:使用copy_object重命名对象

Mik*_*ikA 55 python amazon-s3 amazon-web-services boto3

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

我正在计划的是将对象复制到新对象,然后删除实际对象.

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

Mik*_*ikA 76

我发现了另一个解决方

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()
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢这个解决方案,谢谢.如果有人和我一样绊倒的话,小费.在第一次阅读时,我错过了传递给CopySource*的密钥包括存储桶名称*.很酷的是,这意味着你可以在存储桶之间进行复制,但我被抛出是因为我只是想在同一个存储桶中更改一个密钥,并且没想到要预先添加它.当我这样做时,我得到权限错误而不是更明智的NoSuchBucket错误.这让我更加困惑!希望人们现在可以跳过这个陷阱. (11认同)
  • 对象在复制之前是否有可能被删除?我们如何确保最后两个语句的顺序? (4认同)
  • 我使用CopySource的字典格式(字符串格式对我不起作用):`CopySource ='string'或{'Bucket':'string','Key':'string','VersionId':'string' }基于http://boto3.readthedocs.io/en/latest/reference/services/s3.html#S3.Client.copy_object (2认同)

小智 47

您无法在S3中重命名对象,因此如您所示,您需要将其复制到新名称,然后删除旧名称:

client.copy_object(Bucket="BucketName", CopySource="BucketName/OriginalName", Key="NewName")
client.delete_object(Bucket="BucketName", Key="OriginalName")
Run Code Online (Sandbox Code Playgroud)

  • 它可能为其他用户节省一些时间.`CopySource`参数应包含`BucketName`和`KeyName`.因此,`OriginalName`并不完全是对象键. (6认同)
  • 参数已更改,如@Trein所述。CopySource应该具有以下结构:{{'Bucket':'string','Key':'string','VersionId':'string'}`。这是参考文件。http://boto3.readthedocs.io/en/latest/reference/services/s3.html#S3.Client.copy_object (2认同)

jpg*_*ard 10

以下是更新的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')
Run Code Online (Sandbox Code Playgroud)

上面链接的文档中的注释:

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