समस्या का विवरण - मौजूदा फ़ाइल को सही के रूप में अधिलेखित करने के साथ किसी दिए गए स्थानीय पथ/डिफ़ॉल्ट पथ पर S3 से किसी ऑब्जेक्ट को डाउनलोड करने के लिए पायथन में boto3 लाइब्रेरी का उपयोग करें। उदाहरण के लिए, S3 के बकेट_1/testfolder से test.zip डाउनलोड करें।
इस समस्या को हल करने के लिए दृष्टिकोण/एल्गोरिदम
चरण 1 - अपवादों को संभालने के लिए boto3 और botocore अपवाद आयात करें।
चरण 2 - पाथलिब . से , फ़ाइल नाम जांचने के लिए पथ आयात करें
चरण 3 - s3_path, localpath और ओवरराइट_मौजूदा_फ़ाइल फ़ंक्शन में तीन पैरामीटर हैं download_object_from_s3
चरण 4 - s3_path की पुष्टि करें एडब्ल्यूएस प्रारूप में s3://bucket_name/key . के रूप में पास किया गया है . डिफ़ॉल्ट रूप से, लोकलपाथ =कोई नहीं और ओवरराइट_मौजूदा_फ़ाइल =सही . उपयोगकर्ता इन मानों को किसी दिए गए स्थानीय पथ में डाउनलोड करने के लिए भी पास कर सकता है
चरण 5 - boto3 लाइब्रेरी का उपयोग करके AWS सत्र बनाएं।
चरण 6 - S3 के लिए AWS संसाधन बनाएं।
चरण 7 - S3 पथ को विभाजित करें और रूट बकेट नाम और डाउनलोड करने के लिए ऑब्जेक्ट पथ को अलग करने के लिए संचालन करें।
चरण 8 - जांचें कि क्या ओवरराइट_मौजूदा_फ़ाइल गलत के रूप में सेट करें और फ़ाइल किसी दिए गए स्थानीय पथ में पहले से मौजूद है; ऐसे में कोई भी ऑपरेशन न करें।
चरण 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 में डाउनलोड की जाएगी