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

AWS 리소스를 사용하여 Boto3를 사용하여 S3에서 객체를 다운로드하는 방법은 무엇입니까?

<시간/>

문제 설명 − Python에서 boto3 라이브러리를 사용하여 기존 파일 덮어쓰기를 true로 하여 주어진 로컬 경로/기본 경로에 있는 S3에서 객체를 다운로드합니다. 예를 들어 S3의 Bucket_1/testfolder에서 test.zip을 다운로드합니다.

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

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

2단계pathlib에서 , 파일 이름을 확인하기 위한 가져오기 경로

3단계 - s3_path, localpathoverwrite_existing_file download_object_from_s3 함수의 세 가지 매개변수입니다.

4단계s3_path 확인 s3://bucket_name/key로 AWS 형식으로 전달됩니다. . 기본적으로 localpath =없음overwrite_existing_file =True . 사용자는 이 값을 전달하여 주어진 로컬 경로에서 다운로드할 수도 있습니다.

5단계 − boto3 라이브러리를 사용하여 AWS 세션을 생성합니다.

6단계 − S3용 AWS 리소스를 생성합니다.

7단계 − S3 경로를 분할하여 루트 버킷 이름과 다운로드할 객체 경로를 구분하는 작업을 수행합니다.

8단계overwrite_existing_file 여부 확인 False로 설정하고 파일이 이미 주어진 로컬 경로에 존재합니다. 이 경우 아무 작업도 수행하지 마십시오.

9단계 − 그렇지 않은 경우(이 조건 중 하나라도 참이 아닌 경우) 개체를 다운로드합니다. localpath가 주어지면 거기에서 다운로드하십시오. 그렇지 않으면 기본 경로로 다운로드합니다.

10단계 − 응답 코드에 따라 예외를 처리하여 파일 다운로드 여부를 확인합니다.

11단계 − 파일을 다운로드하는 동안 문제가 발생한 경우 일반 예외를 처리합니다.

예시

다음 코드를 사용하여 AWS S3에서 파일을 다운로드하십시오 -

import boto3
from botocore.exceptions import ClientError
from pathlib import Path

def download_object_from_s3(s3path, localPath=None,
overwrite_existing_file=True):

   if 's3://' not in s3path:
      print('Given path is not a valid s3 path.')
      raise Exception('Given path is not a valid s3 path.')

   session = boto3.session.Session()
   s3_resource = session.resource('s3')

   s3_tokens = s3path.split('/')
   bucket_name = s3_tokens[2]
   object_path = ""
   filename = s3_tokens[len(s3_tokens) - 1]
   print('Filename: ' + filename)

   if len(s3_tokens) > 4:
      for tokn in range(3, len(s3_tokens) - 1):
         object_path += s3_tokens[tokn] + "/"
      object_path += filename
   else:
      object_path += filename
   print('object: ' + object_path)
   try:
      if not overwrite_existing_file and Path.is_file(filename):
         pass
      else:
         if localPath is None:
            s3_resource.meta.client.download_file(bucket_name, object_path, filename)
         else:
            s3_resource.meta.client.download_file(bucket_name, object_path, localPath + '/' + filename)
      print('Filename: ' + filename)
      return filename
   except ClientError as error:
      if error.response['Error']['Code'] == '404':
         print(s3path + " File not found: ")
         raise Exception(s3path + " File not found: ")
   except Exception as error:
      print("Unexpected error in download_object function of s3 helper: " + error.__str__())
      raise Exception("Unexpected error in download_object function of s3 helper: " + error.__str__())

#Download into default localpath
print(download_object_from_s3("s3://Bucket_1/testfolder/test.zip"))
#Download into given path
print(download_object_from_s3("s3://Bucket_1/testfolder/test.zip","C://AWS"))
#File doesn’t exist in S3
print(download_object_from_s3("s3://Bucket_1/testfolder/abc.zip"))

출력

#Download into default localpath
Filename: test.zip
object: testfolder/test.zip
Filename: test.zip

#Download into given path
Filename: test.zip
object: testfolder/test.zip
Filename: test.zip

#File doesn’t exist in S3
Filename: abc.zip
object: testfolder/abc.zip
s3://Bucket_1/testfolder/abc.zip File not found:
botocore.exceptions.ClientError: An error occurred (404) when calling
the HeadObject operation: Not Found

참고: 다운로드할 기본 경로는 이 함수가 작성된 디렉토리입니다. 같은 디렉토리에 로컬 경로를 제공하지 않으면 파일이 다운로드됩니다.

예를 들어 이 함수가 S3_class에 작성되고 이 클래스가 C://AWS/src/S3_class에 있는 경우 test.zip 파일이 C://AWS/src/test.zip에 다운로드됩니다.