如何将所有文件从一个文件夹复制到同一 S3 存储桶中的另一个文件夹

How to copy all files from one folder to another folder in the same S3 bucket

我正在尝试将 s3 存储桶中的所有文件从一个文件夹复制到另一个文件夹。我看到很多从一个存储桶移动到另一个存储桶而不是从一个文件夹移动到另一个文件夹的示例。

根据网上看到的例子,写了下面的代码

import boto3
s3_resource = boto3.resource('s3')
src = 'old_folder'
dest = 'new_folder'

for key in s3_resource.list_objects(Bucket=config.S3_BUCKET)['Contents']:
    files = key['Key']
    copy_source = {'Bucket': config.S3_BUCKET, 'Key': f'{src}/{files}'}
    s3_resource.meta.client.copy(
        copy_source, f'{config.S3_BUCKET}/{dest}/', f'{src}/{files}')

但是,当我 运行 代码时,出现以下错误:

AttributeError: 's3.ServiceResource' object has no attribute 'list_objects'

对于以下行:for key in s3_resource.list_objects(Bucket=config.S3_BUCKET)['Contents']:

我认为我收到错误是因为我使用的是 boto3.resource(s3) 而不是 boto3.client(s3) 但是我在网上看到的示例似乎是使用 boto3.resource(s3) 从一个存储桶中移动文件给另一个。

在 s3 中使用 python 将所有文件从一个文件夹移动到另一个文件夹的正确方法是什么?

我修改了代码,还添加了分页。请看一下:

s3 = boto3.client('s3')

src = 'old_folder'
dest = 'new_folder'

paginator = s3.get_paginator('list_objects')

operation_parameters = {'Bucket': config.S3_BUCKET,
                        'Prefix': src}

page_iterator = paginator.paginate(**operation_parameters)

for page in page_iterator:
    for obj in page['Contents']:
        file = obj['Key']
        #print(file)    
        dest_key = file.replace(src, dest)
        #print("dest_key)
        s3.copy_object(Bucket=config.S3_BUCKET, 
                       CopySource=f'/{config.S3_BUCKET}/{file}', 
                       Key=dest_key)