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

จะใช้ Boto3 เพื่อดาวน์โหลดวัตถุจาก S3 โดยใช้ AWS Resource ได้อย่างไร


คำชี้แจงปัญหา − ใช้ไลบรารี boto3 ใน Python เพื่อดาวน์โหลดวัตถุจาก S3 ที่พาธในเครื่อง/พาธเริ่มต้นที่กำหนดโดยเขียนทับไฟล์ที่มีอยู่ว่าเป็นจริง เช่น ดาวน์โหลด test.zip จาก Bucket_1/testfolder ของ S3

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

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

ขั้นตอนที่ 2 − จาก pathlib , นำเข้าเส้นทางเพื่อตรวจสอบชื่อไฟล์

ขั้นตอนที่ 3s3_path, เส้นทางท้องถิ่น และ overwrite_existing_file คือสามพารามิเตอร์ในฟังก์ชัน download_object_from_s3

ขั้นตอนที่ 4 − ตรวจสอบ s3_path ถูกส่งผ่านในรูปแบบ AWS เป็น s3://bucket_name/key . โดยค่าเริ่มต้น localpath =ไม่มี และ overwrite_existing_file =True . ผู้ใช้สามารถส่งค่าเหล่านี้ได้เช่นกันเพื่อดาวน์โหลดในเส้นทางท้องถิ่นที่กำหนด

ขั้นตอนที่ 5 − สร้างเซสชัน AWS โดยใช้ไลบรารี boto3

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

ขั้นตอนที่ 7 − แยกพาธ S3 และดำเนินการเพื่อแยกชื่อรูทบัคเก็ตและพาธอ็อบเจ็กต์ที่จะดาวน์โหลด

ขั้นตอนที่ 8 − ตรวจสอบว่า overwrite_existing_file ตั้งค่าเป็นเท็จและไฟล์มีอยู่แล้วในเส้นทางท้องถิ่นที่กำหนด ในกรณีนี้ห้ามดำเนินการใดๆ

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