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

Làm cách nào để sử dụng Boto3 để tải xuống một đối tượng từ S3 bằng AWS Resource?

Tuyên bố sự cố - Sử dụng thư viện boto3 bằng Python để tải xuống một đối tượng từ S3 tại một đường dẫn cục bộ / đường dẫn mặc định nhất định với việc ghi đè tệp hiện có thành true. Ví dụ:tải xuống test.zip từ Bucket_1 / testfolder của S3.

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 - Từ pathlib , nhập Đường dẫn để kiểm tra tên tệp

Bước 3 - s3_path, localpath override_existing_file là ba tham số trong hàm download_object_from_s3

Bước 4 - Xác thực s3_path được chuyển ở định dạng AWS là s3:// bucket_name / key . Theo mặc định, localpath =Không có override_existing_file =True . Người dùng cũng có thể chuyển các giá trị này để tải xuống theo một đường dẫn cục bộ nhất định

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

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

Bước 7 - Tách đường dẫn S3 và thực hiện các thao tác để tách tên nhóm gốc và đường dẫn đối tượng để tải xuống.

Bước 8 - Kiểm tra xem có ghi đè_existing_file đặt là Sai và tệp đã tồn tại trong một đường dẫn cục bộ nhất định; trong trường hợp đó, đừng thực hiện bất kỳ thao tác nào.

Bước 9 - Khác (nếu bất kỳ điều kiện nào trong số này không đúng), hãy tải xuống đối tượng. Nếu đường dẫn cục bộ được cung cấp, hãy tải xuống ở đó; nếu không tải xuống đường dẫn mặc định.

Bước 10 - Xử lý ngoại lệ dựa trên mã phản hồi để xác thực xem tệp có được tải xuống hay không.

Bước 11 - Xử lý ngoại lệ chung nếu có sự cố khi tải xuống tệp.

Ví dụ

Sử dụng mã sau để tải xuống tệp từ 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"))

Đầu ra

#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

Lưu ý: Đường dẫn mặc định để tải xuống là thư mục chứa hàm này. Trong cùng một thư mục, tệp sẽ được tải xuống nếu đường dẫn cục bộ không được cung cấp.

Ví dụ:nếu hàm này được viết vào S3_class và lớp này có mặt tại C:// AWS / src / S3_class, thì tệp test.zip sẽ được tải xuống C://AWS/src/test.zip