কম্পিউটার টিউটোরিয়াল

Boto3 এবং AWS Resource ব্যবহার করে S3 থেকে একটি অবজেক্ট ডাউনলোড করার পদ্ধতি


সমস্যা বিবরণ − Python-এ boto3 লাইব্রেরি ব্যবহার করে S3 থেকে একটি অবজেক্ট ডাউনলোড করা একটি নির্দিষ্ট লোকাল পথে/ডিফল্ট পথে ওভাররাইট ইক্সিস্টিং ফাইল true রেখে। উদাহরণস্বরূপ, Bucket_1/testfolder থেকে test.zip ডাউনলোড করা।

এই সমস্যাটি সমাধানের পদ্ধতি/এলগরিদম

ধাপ ১ − boto3 এবং botocore.exceptions ইমপোর্ট করুন এক্সেপশন হ্যান্ডলিং-এর জন্য।

ধাপ ২ − pathlib থেকে Path ইমপোর্ট করুন ফাইলনেম চেক করার জন্য।

ধাপ ৩ − s3_path, localpath এবং overwrite_existing_file হলো download_object_from_s3 ফাংশনের তিনটি প্যারামিটার।

ধাপ ৪ − যাচাই করুন যে s3_path AWS ফরম্যাটে s3://bucket_name/key হিসেবে পাস করা হয়েছে। ডিফল্টভাবে localpath = None এবং overwrite_existing_file = True। ব্যবহারকারী এই মানগুলো পাস করতে পারেন একটি নির্দিষ্ট লোকাল পথে ডাউনলোড করার জন্য।

ধাপ ৫ − boto3 লাইব্রেরি ব্যবহার করে একটি AWS সেশন তৈরি করুন।

ধাপ ৬ − S3-এর জন্য একটি AWS রিসোর্স তৈরি করুন।

ধাপ ৭ − S3 পাথটি স্প্লিট করুন এবং রুট বাকেটের নাম এবং ডাউনলোড করার অবজেক্ট পাথ আলাদা করুন।

ধাপ ৮ − চেক করুন যে overwrite_existing_file False সেট করা আছে কিনা এবং ফাইলটি ইতিমধ্যে প্রদত্ত লোকাল পথে আছে কিনা; সেক্ষেত্রে কোনো অপারেশন করবেন না।

ধাপ ৯ − অন্যথায় (যদি এই শর্তগুলো মিথ্যা হয়), অবজেক্টটি ডাউনলোড করুন। যদি localpath দেওয়া থাকে, তবে সেখানে ডাউনলোড করুন; অন্যথায় ডিফল্ট পথে ডাউনলোড করুন।

ধাপ ১০ − রেসপন্স কোডের ভিত্তিতে এক্সেপশন হ্যান্ডেল করুন যাতে বুঝা যায় ফাইল ডাউনলোড হয়েছে কিনা।

ধাপ ১১ − ফাইল ডাউনলোড করার সময় যদি কিছু ভুল হয় তবে জেনেরিক এক্সেপশন হ্যান্ডেল করুন।

উদাহরণ

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__())

# ডিফল্ট লোকালপথে ডাউনলোড
print(download_object_from_s3("s3://Bucket_1/testfolder/test.zip"))
# নির্দিষ্ট পথে ডাউনলোড
print(download_object_from_s3("s3://Bucket_1/testfolder/test.zip", "C://AWS"))
# S3-তে ফাইল নেই
print(download_object_from_s3("s3://Bucket_1/testfolder/abc.zip"))

আউটপুট

# ডিফল্ট লোকালপথে ডাউনলোড
Filename: test.zip
object: testfolder/test.zip
Filename: test.zip
# নির্দিষ্ট পথে ডাউনলোড
Filename: test.zip
object: testfolder/test.zip
Filename: test.zip
# 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-এ ডাউনলোড হবে।


  1. Boto3 লাইব্রেরি এবং AWS Resource ব্যবহার করে শেষ পরিবর্তনের তারিখের ভিত্তিতে S3 থেকে ফাইলগুলির তালিকা পেতে পদ্ধতি

  2. Boto3 লাইব্রেরি এবং AWS Resource ব্যবহার করে S3-এ একটি অবজেক্ট আপলোড করার পদ্ধতি

  3. Boto3 এবং AWS Resource ব্যবহার করে S3-এ একটি রুট বাকেট আছে কিনা তা নির্ণয় করার পদ্ধতি

  4. Boto3 এবং AWS Client ব্যবহার করে S3-এ উপস্থিত বাকেটগুলির তালিকা পেতে পদ্ধতি