如何使用Python中的Boto3库,基于AWS资源和最后修改日期获取S3文件列表?
问题陈述 − 使用Python中的boto3库获取S3中的文件列表,这些文件是在给定日期时间戳之后修改的。
示例 − 如果在2021-01-21 13:19:56.986445+00:00之后修改了Bucket_1/testfolder中的test.zip,则列出它。
解决此问题的方法/算法
步骤1 − 导入boto3和botocore异常以处理异常。
步骤2 − s3_path和last_modified_timestamp是函数list_all_objects_based_on_last_modified中的两个参数。“last_modified_timestamp”应采用“2021-01-22 13:19:56.986445+00:00”的格式。默认情况下,无论地理位置如何,boto3都理解UTC时区。
步骤3 − 验证s3_path是否以AWS格式(s3://bucket_name/key)传递。
步骤4 − 使用boto3库创建一个AWS会话。
步骤5 − 为S3创建一个AWS资源。
步骤6 − 现在使用list_objects函数列出给定前缀的所有对象,并处理任何异常。
步骤7 − 上述函数的结果是一个字典,它在名为“Contents”的键中包含所有文件级信息。现在将桶级详细信息提取到一个对象中。
步骤8 − 现在,object也是一个字典,包含文件的全部详细信息。现在,获取每个文件的LastModified详细信息并与给定的日期时间戳进行比较。
步骤9 − 如果LastModified大于给定的时间戳,则保存完整的文件名,否则忽略它。
步骤10 − 返回在给定日期时间戳之后修改的文件列表。
示例
以下代码根据最后修改日期时间戳获取AWS S3中的文件列表:
import boto3 from botocore.exceptions import ClientError def list_all_objects_based_on_last_modified(s3_files_path, last_modified_timestamp): if 's3://' not in s3_files_path: raise Exception('Given path is not a valid s3 path.') session = boto3.session.Session() s3_resource = session.resource('s3') bucket_token = s3_files_path.split('/') bucket = bucket_token[2] folder_path = bucket_token[3:] prefix = "" for path in folder_path: prefix = prefix + path + '/' try: result = s3_resource.meta.client.list_objects(Bucket=bucket, Prefix=prefix) except ClientError as e: raise Exception( "boto3 client error in list_all_objects_based_on_last_modified function: " + e.__str__()) except Exception as e: raise Exception( "Unexpected error in list_all_objects_based_on_last_modified function of s3 helper: " + e.__str__()) filtered_file_names = [] for obj in result['Contents']: if str(obj["LastModified"]) >= str(last_modified_timestamp): full_s3_file = "s3://" + bucket + "/" + obj["Key"] filtered_file_names.append(full_s3_file) return filtered_file_names #give a timestamp to fetch test.zip print(list_all_objects_based_on_last_modified("s3://Bucket_1/testfolder" , "2021-01-21 13:19:56.986445+00:00")) #give a timestamp no file is modified after that print(list_all_objects_based_on_last_modified("s3://Bucket_1/testfolder" , "2021-01-21 13:19:56.986445+00:00"))
输出
#give a timestamp to fetch test.zip [s3://Bucket_1/testfolder/test.zip] #give a timestamp no file is modified after that []
广告