Последнее изменение списка файлов времени в aws s3 с использованием python - PullRequest
2 голосов
/ 06 ноября 2019

У меня есть несколько ключей под моим aws s3 bucket. Структура:

ведро / tableName1 / Archive / archive1.json - до - ведро / tableName1 / Archive / archiveN.json ведро / tableName2 / Archive / archive2.json - в - ведро / tableName2 / Archive / archiveN.json, ведро / tableName1 / Audit / audit1.json - в - ведро / tableName1 / Audit / auditN.json, ведро / tableName2 / Audit /audit2.json - to - bucket / tableName2 / Audit / auditN.json

Я хочу получить ключи из папки Audit , только если она естьприсутствовать в ключе и получить только самый последний файл, т. е. который имеет последнее измененное время как самое последнее из этой папки аудита.

В результате я пытаюсь получить список словарей:

[{'tableName1': 'auditN.json'}, {'tableName2': 'auditN.json'}]

Предполагается, что auditN.json равносамый новый файл.

Я пробовал разные методы, но не получаю желаемого результата. Я пытаюсь найти решение на ноутбуке из базы данных. Есть ли способ, которым я могу достичь этого?

1 Ответ

1 голос
/ 07 ноября 2019

Ну, я читал и искал много тем о том, что вы спрашиваете, но не повезло. Итак, мне пришлось написать свою собственную лямбда-функцию.

Следующий фрагмент кода выполняет итерацию по всем папкам, а затем итерацию по подпапкам, проверяет, соответствует ли имя подпапки == Audit, если она сортируется по последнему измененному, и печатаетсамый новый объект.

Имейте в виду, что этот код соответствует только вашей структуре! поскольку функция list_folders возвращает только первые подпапки.

В случае, если ваша структура изменилась на что-то подобное:

bucket/tableName1/Audit/Audit1/audit.json

Лямбда не будет работать.

Фрагмент кода:

import boto3

#bucket Name
bucket_name = 'Bucket Name'
#bucket Resource
s3 = boto3.resource('s3')
bucket = s3.Bucket(bucket_name)

#bucket client
s3_client = boto3.client("s3")

#filter pattern 
get_last_modified = lambda obj: int(obj.last_modified.strftime('%s'))

#get subfolder - 1 LEVEL ONLY ! 
def list_folders(s3_client, bucket_name,prefix):
    response = s3_client.list_objects_v2(Bucket=bucket_name,Prefix=prefix, Delimiter='/')
    for content in response.get('CommonPrefixes', []):
        yield content.get('Prefix')

def lambda_handler(event, context):
    #get all folders 
    folder_list = list_folders(s3_client, bucket_name,'')
    for folder in folder_list:
        #get all subfolders
        subfolders =  list_folders(s3_client, bucket_name,folder)
        for subfolder in subfolders:
            #iterate over subfolders and check if subfolder name equal to Audit
            if 'Audit' == subfolder.split('/')[1]:
                #get all objects under subfolder
                objs = [obj for obj in bucket.objects.filter(Prefix= subfolder)]
                #sort by last modified by filter pattern and get the first object 
                last_modified_file = [obj for obj in sorted(objs, key=get_last_modified)][-1]
                #print results
                print('Last modified file Name: %s ---- Date: %s' % (last_modified_file.key,last_modified_file.last_modified))

Проверено на следующих файлах: enter image description here

Table2 подпапка с именем Archive. enter image description here

enter image description here

Выход:

enter image description here

Надеюсь, вы найдете это полезным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...