Computer >> Máy Tính >  >> Lập trình >> Python

Làm cách nào để sử dụng thư viện Boto3 trong Python để nhận danh sách các tệp từ S3 dựa trên ngày sửa đổi cuối cùng bằng cách sử dụng Tài nguyên AWS?

Tuyên bố sự cố - Sử dụng thư viện boto3 bằng Python để lấy danh sách các tệp từ S3, những tệp đó được sửa đổi sau một dấu thời gian ngày nhất định.

Ví dụ - Liệt kê test.zip từ Bucket_1 / testfolder của S3 nếu nó được sửa đổi sau 2021-01-21 13:19:56.986445 + 00:00.

Phương pháp tiếp cận / Thuật toán để giải quyết vấn đề này

Bước 1 - Nhập các ngoại lệ boto3 và botocore để xử lý các ngoại lệ.

Bước 2 - s3_path last_modified_timestamp là hai tham số trong hàm list_all_objects_based_on_last_modified. "last_modified_timestamp" phải ở định dạng “2021-01-22 13:19:56.986445 + 00:00”. Theo mặc định, boto3 hiểu múi giờ UTC bất kể vị trí địa lý.

Bước 3 - Xác thực s3_path được truyền ở định dạng AWS là s3:// bucket_name / key.

Bước 4 - Tạo phiên AWS bằng thư viện boto3.

Bước 5 - Tạo tài nguyên AWS cho S3.

Bước 6 - Bây giờ liệt kê tất cả các đối tượng của tiền tố đã cho bằng cách sử dụng function list_objects và xử lý các ngoại lệ, nếu có.

Bước 7 - Kết quả của hàm trên là một từ điển và nó chứa tất cả thông tin cấp độ tệp trong một khóa có tên là ‘Nội dung’. Bây giờ trích xuất các chi tiết ở cấp độ nhóm trong một đối tượng.

Bước 8 - Bây giờ, đối tượng cũng là một từ điển có tất cả các chi tiết của một tệp. Bây giờ, tìm nạp LastModified chi tiết của từng tệp và so sánh với dấu thời gian ngày đã cho.

Bước 9 - Nếu LastModified lớn hơn dấu thời gian đã cho, hãy lưu tên tệp hoàn chỉnh, nếu không, hãy bỏ qua.

Bước 10 - Trả lại danh sách các tệp đã được sửa đổi sau dấu thời gian ngày nhất định.

Ví dụ

Đoạn mã sau lấy danh sách các tệp từ AWS S3 dựa trên dấu thời gian ngày sửa đổi gần đây nhất -

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"))

Đầu ra

#give a timestamp to fetch test.zip
[s3://Bucket_1/testfolder/test.zip]
#give a timestamp no file is modified after that
[]