সমস্যা বিবৃতি − একটি প্রদত্ত স্থানীয় পাথ/ডিফল্ট পাথে S3 থেকে একটি বস্তু ডাউনলোড করতে পাইথনে boto3 লাইব্রেরি ব্যবহার করুন এবং বিদ্যমান ফাইলটিকে সত্য হিসেবে ওভাররাইট করুন। উদাহরণস্বরূপ, S3-এর Bucket_1/testfolder থেকে test.zip ডাউনলোড করুন।
এই সমস্যা সমাধানের জন্য অ্যাপ্রোচ/অ্যালগরিদম
ধাপ 1 − ব্যতিক্রমগুলি পরিচালনা করতে boto3 এবং botocore ব্যতিক্রমগুলি আমদানি করুন৷
৷ধাপ 2 - পাথলিব থেকে , ফাইলের নাম চেক করতে পাথ আমদানি করুন
ধাপ 3 − s3_path, localpath এবং overwrite_existing_file download_object_from_s3 ফাংশনের তিনটি প্যারামিটার
পদক্ষেপ 4৷ − s3_path যাচাই করুন AWS ফরম্যাটে s3://bucket_name/key হিসাবে পাস করা হয় . ডিফল্টরূপে, localpath =None এবং overwrite_existing_file =True . ব্যবহারকারী প্রদত্ত স্থানীয় পাথে ডাউনলোড করতে এই মানগুলিও পাস করতে পারে
ধাপ 5 - boto3 লাইব্রেরি ব্যবহার করে একটি AWS সেশন তৈরি করুন৷
৷ধাপ 6 - S3 এর জন্য একটি AWS রিসোর্স তৈরি করুন।
পদক্ষেপ 7 − S3 পাথকে বিভক্ত করুন এবং রুট বাকেটের নাম এবং অবজেক্ট পাথ ডাউনলোড করার জন্য আলাদা করার জন্য অপারেশন করুন৷
ধাপ 8 - ওভাররাইট_এক্সস্টিং_ফাইল কিনা তা পরীক্ষা করুন False হিসাবে সেট করুন এবং ফাইলটি ইতিমধ্যেই একটি প্রদত্ত স্থানীয় পাথে বিদ্যমান; সেক্ষেত্রে কোন অপারেশন করবেন না।
ধাপ 9 − অন্যথায় (যদি এই শর্তগুলির মধ্যে কোনটি সত্য না হয়), অবজেক্টটি ডাউনলোড করুন। যদি লোকালপথ দেওয়া থাকে, সেখানে ডাউনলোড করুন; অন্যথায় ডিফল্ট পাথে ডাউনলোড করুন।
ধাপ 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
এ ডাউনলোড করা হবে।