使用Python在AWS S3中上次修改的时间文件列表

aws s3存储桶下有多个键。 结构是:

bucket / tableName1 / Archive / archive1.json--bucket / tableName1 / Archive / archiveN.json bucket / tableName2 / Archive / archive2.json--bucket / tableName2 / Archive / archiveN.json bucket / tableName1 / Audit / audit1.json--bucket / tableName1 / Audit / auditN.json bucket / tableName2 / Audit / audit2.json--bucket / tableName2 / Audit / auditN.json

我只想从 Audit文件夹中获取密钥,并且仅从该Audit文件夹中获取最新的文件,即修改时间最近的文件。

我想要得到的结果是字典列表:

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

假设 auditN.json 是最新文件。

我尝试了不同的方法,但没有得到预期的结果。我正在databricks笔记本上尝试解决方案。 有什么办法可以做到这一点?

szs1987 回答:使用Python在AWS S3中上次修改的时间文件列表

好吧,我一直在阅读和搜索很多有关您所要询问的主题的文章,但是没有运气。因此,我不得不编写自己的lambda函数。

下面的代码片段遍历所有文件夹,然后遍历子文件夹,检查子文件夹名称是否==审核,是否按上次修改排序并打印最新对象。

请注意,此代码仅适合您的结构!因为list_folders函数仅返回第一个子文件夹。

如果您的结构更改为类似的内容:

bucket/tableName1/Audit/Audit1/audit.json

lambda不起作用。

代码段:

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,'')
    for folder in folder_list:
        #get all subfolders
        subfolders =  list_folders(s3_client,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

希望您会发现它很有帮助。

本文链接:https://www.f2er.com/3156405.html

大家都在问