如何使用 Python 中的 Boto3 库根据使用 AWS 资源的最后修改日期从 S3 获取文件列表?
问题陈述-使用Python中的boto3库从S3获取文件列表,这些文件在给定的日期时间戳后被修改。
示例-test.zip如果在2021-01-2113:19:56.986445+00:00之后修改,则从S3的Bucket_1/testfolder中列出。
解决这个问题的方法/算法
步骤1-导入boto3和botocore异常以处理异常。
步骤2-s3_path和last_modified_timestamp是函数list_all_objects_based_on_last_modified中的两个参数。“last_modified_timestamp”的格式应为“2021-01-2213:19:56.986445+00:00”。默认情况下,无论地理位置如何,boto3都能理解UTC时区。
步骤3-验证s3_path以AWS格式作为s3://bucket_name/key传递。
步骤4-使用boto3库创建AWS会话。
步骤5-为S3创建AWS资源。
第6步-现在使用函数list_objects列出给定前缀的所有对象并处理异常(如果有)。
Step7-上述函数的结果是一个字典,它包含名为“Contents”的键中的所有文件级信息。现在提取对象中的桶级详细信息。
步骤8-现在,对象也是一个包含文件所有细节的字典。现在,获取每个文件的LastModified 详细信息并与给定的日期时间戳进行比较。
Step9-如果LastModified大于给定的时间戳,保存完整的文件名,否则忽略它。
步骤10-返回在给定日期时间戳之后修改的文件列表。
示例
以下代码根据上次修改日期时间戳从AWSS3获取文件列表-
import boto3 frombotocore.exceptionsimport 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 #给一个时间戳来获取test.zip print(list_all_objects_based_on_last_modified("s3://Bucket_1/testfolder" , "2021-01-21 13:19:56.986445+00:00")) #给一个时间戳,之后没有文件被修改 print(list_all_objects_based_on_last_modified("s3://Bucket_1/testfolder" , "2021-01-21 13:19:56.986445+00:00"))输出结果
#给一个时间戳来获取test.zip [s3://Bucket_1/testfolder/test.zip] #给一个时间戳,之后没有文件被修改 []