amazon-s3 - 使用 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
解决方案
我能够通过在 dynamodb 表中创建一个条目来解决此问题。逻辑:
as soon as the first instance is encountered then entry is made in dynamodb table.
当遇到下一个实例时,在复制数据之前在 dynamodb 表中进行相应的检查,并采用 dynamodb 中存在的相同日期。
推荐阅读
- salesforce - 如何使用 jitterbit 从 Salesforce 查询大数据
- c# - C# Entity Framework,删除子项然后删除父项,DELETE 语句与 REFERENCE 约束冲突
- r - 如何在同一数据中拟合两个线性回归?
- javascript - 如何使用 React Redux 将道具传递给子组件?
- php - mysqli_query 的输出是什么?
- java - 如何读取文件夹中存在的所有 Zip 文件并创建一个包含所有内容的新文本文件
- sql - postgresql - 使用大小写检查表之间是否存在关系并存在
- go - 浏览器 websocket 在发送 flatbuffer 字节时发出“无法将文本帧解码为 UTF-8”
- focus - 当我按回车键或单击文本字段外部时,如何删除文本字段焦点?(SwiftUI,MacOS)
- javascript - 在移动设备上放大时如何删除页面下的空白