【问题标题】:Boto3/S3: Renaming an object using copy_objectBoto3/S3:使用 copy_object 重命名对象
【发布时间】:2015-12-06 17:56:22
【问题描述】:

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

我的计划是将对象复制到一个新对象,然后删除实际对象。

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

【问题讨论】:

    标签: python amazon-web-services amazon-s3 boto3


    【解决方案1】:

    您无法重命名 S3 中的对象,因此您需要将其复制为新名称,然后删除旧名称:

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

    【讨论】:

    • 我收到以下错误:botocore.exceptions.ClientError:调用 CopyObject 操作时发生错误(NoSuchBucket):指定的存储桶不存在我设置 Bucket='xyz-abc-yzd' ''xyz-abc-yzd' 是我的存储桶名称在哪里设置存储桶名称/密钥时要遵循任何约定?
    • 我可以使用 'list_buckets()' 列出相同的存储桶
    • 它可能会为其他用户节省一些时间。 CopySource 参数应包含 BucketNameKeyName。所以,OriginalName 不完全是对象键。
    • @Trein - 谢谢!我正在把这里的空气变成蓝色,想知道wtf。
    • 参数已更改,正如@Trein 所述。 CopySource 应具有以下结构:{'Bucket': 'string', 'Key': 'string', 'VersionId': 'string'}。这是供参考的文档。 boto3.readthedocs.io/en/latest/reference/services/…
    【解决方案2】:

    我找到了另一个解决方案

    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 的密钥包括存储桶名称。很酷的是,这意味着您可以在存储桶之间进行复制,但是我被抛出了,因为我只是想更改同一个存储桶中的一个键,而没有想到要预先设置它。当我这样做时,我得到了权限错误,而不是更明智的 NoSuchBucket 错误。这让我更加困惑!希望人们现在可以跳过这个陷阱。
    • 我使用了 CopySource 的字典格式(字符串格式不适合我):CopySource='string' or {'Bucket': 'string', 'Key': 'string', 'VersionId': 'string'} 基于 boto3.readthedocs.io/en/latest/reference/services/…
    • 对象是否有可能在复制之前被删除?我们如何保证最后两条语句的顺序?
    • 唯一的问题是,如果您将它们附加到存储桶,它将再次触发事件。
    • 如果您实际上只是想移动文件(真正更改指针位置),这不是效率低下吗?因为这里我们必须实际复制字节。有没有办法只改变ref(即传统的mv操作)?
    【解决方案3】:

    以下示例来自更新的 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 的回答,它正在使用资源复制
    • 这对我有用。 s3 应该是 s3 客户端而不是资源
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-01
    • 2023-03-11
    相关资源
    最近更新 更多