Скрипт AWS Lambda Python для итерации по корзине S3 и копирования ежедневных файлов в другую корзину S3 - PullRequest
0 голосов
/ 07 июня 2018

Требование заключается в том, что в исходной корзине мы получаем исторические ежедневные файлы.Файлы имеют формат -

Исходная корзина -

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 - дата 1 марта 2018 года, а 000014 - часы, минуты и секунды - ччммсс

Как только мы получим все почасовые файлы для1 марта нам нужно скопировать эти файлы в другое ведро, а затем выполнить дальнейшую обработку.В настоящее время копия работает нормально.Он копирует все файлы, присутствующие в исходной корзине, в место назначения.Но я не уверен, как применить фильтр таким образом, чтобы он сначала выбирал файл только 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.Любое руководство приветствуется.

1 Ответ

0 голосов
/ 07 июня 2018

Вы можете извлечь часть строки даты из имени файла (в идеале, разделив строку на '_') и передать ее в функцию обработки, такую ​​как:

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()
...