这里要求的是,在源存储桶中我们会收到历史日常文件。文件格式为 -
来源桶 -
s3://sourcebucket/abc/111111_abc_1180301000014_1-3_1180301042833.txt
s3://sourcebucket/abc/111111_cde_1180302000042_2-3_1180302042723.txt
这些是样本值,因为我无法发布确切的文件名 -
111111_abc_1180301000014_1-3_1180301042833.txt
其中1180301000014是日期和时间180301 - 日期2018年3月1日和 000014是小时,分钟和秒 - hhmmss
一旦我们收到3月1日的所有小时文件,我们需要将这些文件复制到另一个存储桶,然后进行进一步处理。目前,复制部分工作正常。它将源存储桶中存在的所有文件复制到目标。但是,我不知道如何应用过滤器,以便它首先选择3月1日文件并将其复制到另一个桶。然后它应该按顺序选择剩余的文件。
Python脚本 -
import boto3
import json
s3 = boto3.resource('s3')
def lambda_handler(event, context):
bucket = s3.Bucket('<source-bucket>')
dest_bucket = s3.Bucket('<destination-bucket>')
for obj in bucket.objects.filter(Prefix='abc/',Delimiter='/'):
dest_key = obj.key
print(dest_key)
s3.Object(dest_bucket.name, dest_key).copy_from(CopySource = {'Bucket': obj.bucket_name, 'Key': obj.key})
我不是那么精通python。实际上这是我的第一个python脚本。任何指导都表示赞赏。
答案 0 :(得分:2)
您可以提取文件名的日期字符串部分(理想情况下,将字符串拆分为“_”)并将其传递给处理函数,例如:
from datetime import datetime as dt
def parse_date(date_string):
form = "%y%m%d%H%M%S"
date = dt.strptime(date_string, form)
#dt.utcnow() will return a UTC representation of the current time
diff = dt.now() - date
if diff.days >= 1:
return False
return True
#False
print(parse_date("180301000014"))
#True as of the date of this post
print(parse_date("180606000014"))
您可以查看https://docs.python.org/3/library/datetime.html以获取有关在Python中处理日期的更多信息。您还需要考虑时区。
按天与目标日期匹配:
def by_target_date(date_string, target_date):
form = "%y%m%d%H%M%S"
date = dt.strptime(date_string, form)
if date > target_date:
#Check that days match and that month and year are the same
if date.day == target_date.day and (date - target_date).days <= 1:
return do_things()
if date.day == target_date.day and (target_date - date).days <= 1:
return do_things()