如何使用 Python 中的 Boto3 库根据上次使用 AWS 资源的修改日期从 S3 获取文件列表?

boto3pythonserver side programmingprogramming

问题陈述 − 使用 Python 中的 boto3 库从 S3 获取文件列表,这些文件在给定的日期时间戳之后被修改。

示例 − 如果 test.zip 在 2021-01-21 13:19:56.986445+00:00 之后被修改,则从 S3 的 Bucket_1/testfolder 中列出它。

解决此问题的方法/算法

步骤 1 − 导入 boto3 和 botocore 异常来处理异常。

步骤 2s3_pathlast_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 − 现在,对象也是一个包含文件所有详细信息的字典。现在,获取每个文件的 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

# 给出一个时间戳来获取 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]
#给出一个时间戳,此后没有文件被修改
[]

相关文章