Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

Python에서 Boto3 라이브러리를 사용하여 AWS 리소스를 사용하여 마지막으로 수정한 날짜를 기준으로 S3에서 파일 목록을 가져오는 방법은 무엇입니까?

<시간/>

문제 설명 − Python에서 boto3 라이브러리를 사용하여 S3에서 파일 목록을 가져옵니다. 이러한 파일은 지정된 날짜 타임스탬프 이후에 수정됩니다.

− 2021-01-21 13:19:56.986445+00:00 이후에 수정된 경우 S3의 Bucket_1/testfolder에서 test.zip을 나열합니다.

이 문제를 해결하기 위한 접근 방식/알고리즘

1단계 − boto3 및 botocore 예외를 가져와 예외를 처리합니다.

2단계 - s3_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가 s3://bucket_name/key와 같은 AWS 형식으로 전달되었는지 확인합니다.

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

#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
[]