如何使用Python boto3将S3对象从一个存储桶复制到另一个存储桶

61

我想从一个S3存储桶复制文件到另一个存储桶。但是我遇到了以下错误:

s3.meta.client.copy(source,dest)
TypeError: copy() 至少需要4个参数 (已提供3个)

我阅读文档后仍无法找到解决方案。这是我的代码:

#!/usr/bin/env python
import boto3
s3 = boto3.resource('s3')
source= { 'Bucket' : 'bucketname1','Key':'objectname'}
dest ={ 'Bucket' : 'Bucketname2','Key':'backupfile'}
s3.meta.client.copy(source,dest)

这个答案有效 https://dev59.com/5F0a5IYBdhLWcg3wk5hw#68849632 - Mohamed Jaleel Nazir
3个回答

132

你可以尝试:

import boto3
s3 = boto3.resource('s3')
copy_source = {
      'Bucket': 'mybucket',
      'Key': 'mykey'
    }
bucket = s3.Bucket('otherbucket')
bucket.copy(copy_source, 'otherkey')
或者
import boto3
s3 = boto3.resource('s3')
copy_source = {
    'Bucket': 'mybucket',
    'Key': 'mykey'
 }
s3.meta.client.copy(copy_source, 'otherbucket', 'otherkey')

请注意参数之间的差异。


4
当源存储桶是不在我的账户下的公共 S3 存储桶时,这会如何改变? - geominded
@geominded 请看这个链接:https://aws.amazon.com/premiumsupport/knowledge-center/copy-s3-objects-account/希望对你有所帮助。 - Adarsh
这个函数是不是非常奇怪啊?源是一个字典,但目的地却是两个字符串?AWS到底在想什么?当然,键名还要大写,以确保它们不遵循任何约定... - foobarbecue
@foobarbecue 是的,这不是最好的方式。我还没有检查最近的修订。可能会被修复。如果没有,可以在他们的代码库中创建一个问题。 - Adarsh

12

你既然在使用S3服务资源,为什么不完全使用它自己的copy方法呢?

#!/usr/bin/env python
import boto3
s3 = boto3.resource('s3')
source= { 'Bucket' : 'bucketname1', 'Key': 'objectname'}
dest = s3.Bucket('Bucketname2')
dest.copy(source, 'backupfile')

copy() missing 1 required positional argument: 'Key' - techkuz

9
以下是来自文档中的语法:
import boto3

s3 = boto3.resource('s3')
copy_source = {
    'Bucket': 'mybucket',
    'Key': 'mykey'
}
s3.meta.client.copy(copy_source, 'otherbucket', 'otherkey')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接