समस्या विवरण
Python में boto3 लाइब्रेरी का उपयोग करके S3 से ऑब्जेक्ट को दिए गए स्थानीय पथ/डिफ़ॉल्ट पथ पर डाउनलोड करें, जिसमें मौजूदा फ़ाइल को ओवरराइट करने का विकल्प हो। उदाहरण के लिए, S3 के Bucket_1/testfolder से test.zip डाउनलोड करें।
इस समस्या को हल करने का दृष्टिकोण/एल्गोरिदम
चरण 1 - अपवादों को संभालने के लिए boto3 और botocore अपवाद आयात करें।
चरण 2 - pathlib से Path आयात करें ताकि फ़ाइलनाम की जांच की जा सके।
चरण 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 - जांचें कि क्या 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__())
# डिफ़ॉल्ट localpath में डाउनलोड करें
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"))
आउटपुट
# डिफ़ॉल्ट localpath में डाउनलोड करें 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 में डाउनलोड होगी।