首页 > 解决方案 > 使用 Boto3 Python 将文件从一个 s3 文件夹传输到另一个 s3 文件夹

问题描述

我正在尝试将文件从一个 s3 存储桶复制到另一个存储桶,并对目标路径进行一些修改。

原脚本如下:

import boto3
import os
old_bucket_name = 'XT01-sample-data'
old_prefix = 'Test/'
new_bucket_name = 'XT02-sample-data2'
new_prefix = old_bucket_name + '/' + old_prefix
s3 = boto3.resource('s3')
ENCRYPTION = os.environ.get('SERVER_SIDE_ENCRYPTION', 'AES256')
STORAGE_CLASS = os.environ.get('STORAGE_CLASS', 'INTELLIGENT_TIERING')
old_bucket = s3.Bucket(old_bucket_name)
new_bucket = s3.Bucket(new_bucket_name)
extra_args = {
                'ServerSideEncryption': ENCRYPTION,
                'StorageClass': STORAGE_CLASS
              }

for obj in old_bucket.objects.filter(Prefix=old_prefix):
    old_source = { 'Bucket': old_bucket_name,
                   'Key': obj.key}
    # replace the prefix
    new_key = obj.key.replace(old_prefix, new_prefix, 1)
    new_obj = new_bucket.Object(new_key)
    print("Object old ", obj)
    print("new_key ", new_key)
    print("new_obj ", new_obj)
    new_obj.copy(old_source,ExtraArgs=extra_args)

print("Starting Deletion Loop")
bucket = s3.Bucket(old_bucket_name)
bucket.objects.filter(Prefix=old_prefix).delete()

上述脚本将文件从存储桶 XT01-sample-data, 文件夹 Test/ 复制到新存储桶 XT02-sample-data2 和新路径 XT01-sample-data/Test1/

现在的要求是修改脚本以在目标路径中添加时间戳,并且来自一个文件夹的文件位于一次时间戳之下。

例如:我们在各个文件夹的源存储桶中有以下文件

XT01-sample-data/Test1/Test1.1/File1.csv
XT01-sample-data/Test1/Test1.1/File2.csv
XT01-sample-data/Test1/Test1.1/File3.csv
XT01-sample-data/Test1/Test1.2/File1.2.1.csv
XT01-sample-data/Test1/Test1.2/File1.2.2.csv
XT01-sample-data/Test1/Test1.3/File1.3.csv
XT01-sample-data/Test1/Test2/Test2.1/File2.1.csv

预期的输出应该是一个子文件夹中的所有文件都应该放在一个时间戳下。并非所有文件都应该放在一个时间戳中,应该基于毫秒级别的时间戳(unix时间戳)进行一定程度的隔离


对于文件夹 Test1/Test1.1 下的文件

XT01-sample-data/Test1/2020/01/23/0000/File1.csv
XT01-sample-data/Test1/2020/01/23/0000/File2.csv
XT01-sample-data/Test1/2020/01/23/0000/File3.csv

对于文件夹 Test1/Test1.2 下的文件

XT01-sample-data/Test1/2020/01/23/0003/File1.2.1.csv
XT01-sample-data/Test1/2020/01/23/0003/File1.2.2.csv

对于文件夹 Test1/Test1.3 下的文件

XT01-sample-data/Test1/2020/01/23/0004/File1.3.csv

对于文件夹 Test1/Test2/Test2.1 下的文件

XT01-sample-data/Test1/2020/01/23/0005/File2.1.csv

标签: amazon-s3aws-lambdaboto3

解决方案


我能够通过在 dynamodb 表中创建一个条目来解决此问题。逻辑:

 as soon as the first instance is encountered then entry is made in dynamodb table.

当遇到下一个实例时,在复制数据之前在 dynamodb 表中进行相应的检查,并采用 dynamodb 中存在的相同日期。


推荐阅读