【问题标题】: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')

【问题讨论】:

  • 如果您不需要编程解决方案,您可以考虑AWS Command-Line Interface (CLI),它可以通过aws s3 cp --recursiveaws s3 sync 复制文件夹。

标签: 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 浏览器中显示。要复制“文件夹”,您必须复制所有带有公共键前缀的对象。

    【讨论】:

      猜你喜欢
      • 2018-06-02
      • 1970-01-01
      • 2023-02-01
      • 2018-05-08
      • 2022-06-12
      • 1970-01-01
      • 1970-01-01
      • 2018-11-22
      • 1970-01-01
      相关资源
      最近更新 更多