Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

วิธีใช้ไลบรารี Boto3 ใน Python เพื่อรับรายการไฟล์จาก S3 ตามวันที่แก้ไขล่าสุดโดยใช้ทรัพยากร AWS


คำชี้แจงปัญหา − ใช้ไลบรารี boto3 ใน Python เพื่อรับรายการไฟล์จาก S3 ซึ่งจะถูกแก้ไขหลังจากประทับวันที่ที่กำหนด

ตัวอย่าง − แสดงรายการ test.zip จาก Bucket_1/testfolder ของ S3 หากมีการแก้ไขหลังปี 2021-01-21 13:19:56.986445+00:00

แนวทาง/อัลกอริทึมในการแก้ปัญหานี้

ขั้นตอนที่ 1 - นำเข้าข้อยกเว้น boto3 และ botocore เพื่อจัดการกับข้อยกเว้น

ขั้นตอนที่ 2s3_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 − สร้างเซสชัน AWS โดยใช้ไลบรารี boto3

ขั้นตอนที่ 5 − สร้างทรัพยากร AWS สำหรับ S3

ขั้นตอนที่ 6 - ตอนนี้แสดงรายการวัตถุทั้งหมดของคำนำหน้าที่กำหนดโดยใช้ฟังก์ชัน list_objects และจัดการข้อยกเว้น หากมี

ขั้นตอนที่ 7 − ผลลัพธ์ของฟังก์ชันข้างต้นคือพจนานุกรมและประกอบด้วยข้อมูลระดับไฟล์ทั้งหมดในคีย์ที่ชื่อว่า "เนื้อหา" ตอนนี้แยกรายละเอียดระดับที่เก็บข้อมูลในวัตถุ

ขั้นตอนที่ 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
[]