【问题标题】:how to copy files and folders from one S3 bucket to another S3 using python boto3如何使用 python boto3 将文件和文件夹从一个 S3 存储桶复制到另一个 S3
【发布时间】:2020-01-28 21:43:01
【问题描述】:
我想将文件和文件夹从一个 s3 存储桶复制到另一个存储桶。
我无法通过阅读文档找到解决方案。
只能从 s3 存储桶复制文件,但不能复制文件夹。
这是我的代码:
import boto3
s3 = boto3.resource('s3')
copy_source = {
'Bucket': 'mybucket',
'Key': 'mykey'
}
s3.meta.client.copy(copy_source, 'otherbucket', 'otherkey')
【问题讨论】:
标签:
python
python-3.x
amazon-web-services
amazon-s3
boto3
【解决方案1】:
S3 没有任何文件夹/目录的概念。它遵循扁平结构。
例如看起来,
在 UI 上,您会在 test_folder 中看到 2 个名为 file1.txt 和 file2.txt 的文件,但实际上两个文件的键为
“test_folder/file1.txt”和“test_folder/file2.txt”。
每个文件都按此命名约定存储。
您可以使用下面给出的代码 sn-p 将每个密钥复制到其他存储桶。
import boto3
s3_client = boto3.client('s3')
resp = s3_client.list_objects_v2(Bucket='mybucket')
keys = []
for obj in resp['Contents']:
keys.append(obj['Key'])
s3_resource = boto3.resource('s3')
for key in keys:
copy_source = {
'Bucket': 'mybucket',
'Key': key
}
bucket = s3_resource.Bucket('otherbucket')
bucket.copy(copy_source, 'otherkey')
如果您的源存储桶包含许多键,并且这是一次性活动,那么我建议您结帐this link。
如果您的存储桶上的每个插入事件都需要执行此操作,并且您需要将其复制到另一个存储桶,您可以签出this approach。
【解决方案2】:
S3 是平面对象存储,那里没有“文件夹”。它由键前缀构成,用于在 S3 浏览器中显示。要复制“文件夹”,您必须复制所有带有公共键前缀的对象。