Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Python

AWS Resource का उपयोग करके Boto3 से S3 ऑब्जेक्ट कैसे डाउनलोड करें?


समस्या विवरण

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 में डाउनलोड होगी।


  1. - AWS Resource का उपयोग करके Boto3 लाइब्रेरी से S3 में ऑब्जेक्ट कैसे अपलोड करें?

    समस्या विवरण Python में Boto3 लाइब्रेरी का उपयोग करके S3 में ऑब्जेक्ट अपलोड करें। उदाहरण के लिए, test.zip को S3 के Bucket_1 में कैसे अपलोड करें। इस समस्या को हल करने का दृष्टिकोण/एल्गोरिदम चरण 1 - अपवादों को संभालने के लिए boto3 और botocore अपवाद आयात करें। चरण 2 - pathlib से PurePosixPath आयात करे

  1. - Boto3 और AWS Resource का उपयोग करके S3 में रूट बकेट मौजूद है या नहीं कैसे निर्धारित करें?

    समस्या विवरण Python में Boto3 लाइब्रेरी का उपयोग करके निर्धारित करें कि S3 में रूट बकेट मौजूद है या नहीं। उदाहरण - Bucket_1 S3 में मौजूद है या नहीं। इस समस्या को हल करने का दृष्टिकोण/एल्गोरिदम चरण 1 - अपवादों को संभालने के लिए boto3 और botocore अपवाद आयात करें। चरण 2 - boto3 लाइब्रेरी का उपयोग करके

  1. - AWS Client का उपयोग करके Boto3 से S3 में मौजूद बकेट की सूची कैसे प्राप्त करें?

    समस्या विवरण Python में Boto3 लाइब्रेरी का उपयोग करके AWS में मौजूद सभी बकेट की सूची प्राप्त करें। उदाहरण - BUCKET_1, BUCKET2, BUCKET_3 जैसे बकेट के नाम प्राप्त करें। इस समस्या को हल करने का दृष्टिकोण/एल्गोरिदम चरण 1 - अपवादों को संभालने के लिए boto3 और botocore अपवाद आयात करें। चरण 2 - Boto3 लाइब्