বোটো 3 ব্যবহার করে কীভাবে কোনও এস 3 অবজেক্টে ফাইল বা ডেটা লিখবেন


103

বোটো 2 এ, আপনি এই পদ্ধতিগুলি ব্যবহার করে কোনও এস 3 অবজেক্টে লিখতে পারেন:

বোটো 3 সমমান কি আছে? এস 3 এ সঞ্চিত কোনও অবজেক্টে ডেটা সংরক্ষণের বোটো 3 পদ্ধতি কী?

উত্তর:


211

বোটো 3 এ, 'কী.সেট_কন্টেন্টস_ফর্ম_' পদ্ধতিগুলি প্রতিস্থাপিত হয়েছিল

উদাহরণ স্বরূপ:

import boto3

some_binary_data = b'Here we have some data'
more_binary_data = b'Here we have some more data'

# Method 1: Object.put()
s3 = boto3.resource('s3')
object = s3.Object('my_bucket_name', 'my/key/including/filename.txt')
object.put(Body=some_binary_data)

# Method 2: Client.put_object()
client = boto3.client('s3')
client.put_object(Body=more_binary_data, Bucket='my_bucket_name', Key='my/key/including/anotherfilename.txt')

বিকল্পভাবে, বাইনারি ডেটা কোনও ফাইল পড়া থেকে আসতে পারে, যেমন বোটো 2 এবং বোটো 3 এর তুলনা করে অফিসিয়াল ডক্সে বর্ণিত :

তথ্য সংরক্ষণ

কোনও ফাইল, স্ট্রিম বা স্ট্রিং থেকে ডেটা সঞ্চয় করা সহজ:

# Boto 2.x
from boto.s3.key import Key
key = Key('hello.txt')
key.set_contents_from_file('/tmp/hello.txt')

# Boto 3
s3.Object('mybucket', 'hello.txt').put(Body=open('/tmp/hello.txt', 'rb'))

botocore.exferences.NoCredentialsError: কীভাবে এটি ঠিক করবেন শংসাপত্রগুলি সনাক্ত করতে অক্ষম?
— গভীর মুর্তি

2
@ প্রদীপমূর্তি আমি নিশ্চিত নই আপনি কেন এই ত্রুটিটি পাচ্ছেন ... আপনার একটি নতুন স্ট্যাক ওভারফ্লো প্রশ্ন জিজ্ঞাসা করা উচিত এবং বিষয়টি সম্পর্কে আরও বিশদ সরবরাহ করা দরকার।
— jkdev

1
আমি যখন চেষ্টা s3.Object().put()করি তখন শূন্যের সাথে একটি বিষয় শেষ করি content-length। আমার জন্য put()কেবল স্ট্রিং ডেটা গ্রহণ করে তবে put(str(binarydata)) মনে হয় কিছু এনকোডিংয়ের সমস্যা রয়েছে। আমি মূল অবধি প্রায় 3 গুণ আকারের একটি অবজেক্ট দিয়ে শেষ করি যা এটি আমার পক্ষে অকেজো করে তোলে।
— ব্যবহারকারী1129682

@ user1129682 আমি নিশ্চিত না কেন এটি। আপনি কি দয়া করে একটি নতুন প্রশ্ন জিজ্ঞাসা করতে পারেন এবং আরও বিশদ সরবরাহ করতে পারেন?
— জেকেদেব

@ জেকদেব আপনি যদি একবার দেখে নিতে পারেন তবে দুর্দান্ত ।
— ব্যবহারকারী1129682

48

boto3 এর সরাসরি ফাইল আপলোড করার জন্য একটি পদ্ধতিও রয়েছে:

s3.Bucket('bucketname').upload_file('/local/file/here.txt','folder/sub/path/to/s3key')

http://boto3.readthedocs.io/en/latest/reference/services/s3.html#S3.Bucket.upload_file


5
এটি ভাল তবে এটি বর্তমানে মেমরিতে থাকা ডেটা সংরক্ষণের অনুমতি দেয় না।
— রিড

3
@ রিড: ইন-মেমরি ফাইলগুলির জন্য আপনি তার s3.Bucket(...).upload_fileobj()পরিবর্তে পদ্ধতিটি ব্যবহার করতে পারেন ।
— সোভাহারা

36

এস 3-তে ফাইল লেখার আগে আপনাকে আর সামগ্রীগুলি বাইনারিতে রূপান্তর করতে হবে না। নিম্নলিখিত উদাহরণটি স্ট্রিংয়ের বিষয়বস্তু সহ একটি এস 3 বালতিতে একটি নতুন পাঠ্য ফাইল (যাকে newfile.txt বলা হয়) তৈরি করে:

import boto3

s3 = boto3.resource(
    's3',
    region_name='us-east-1',
    aws_access_key_id=KEY_ID,
    aws_secret_access_key=ACCESS_KEY
)
content="String content to write to a new S3 file"
s3.Object('my-bucket-name', 'newfile.txt').put(Body=content)

আমার 'পুট' ক্রিয়াটির কোনও অ্যাক্সেস নেই এমন ধারণা নেই। আমি এই বালতিটি তৈরি করেছি এবং আমার ক্যানোনিকাল আইডি অ্যাক্সেস তালিকার নীচে রেখেছি।
— চেন লিন

এক্ষেত্রে কীভাবে দেবেন prefix? মানে, আপনি যদি ফাইলটি স্টোর করতে চান my-bucket-name/subfolder/?
— কেভ

3
@ কেভ আপনি 'newfile.txt' এর পরিবর্তে ফাইলের নাম 'সাবফোল্ডার / newfile.txt' এর সাথে উল্লেখ করতে পারেন
— মাধব ক্যারিলো

পুনরায় "এস 3-তে ফাইল লেখার আগে আপনাকে আর বিষয়বস্তুগুলিকে বাইনারি রূপান্তর করতে হবে না" ", এটি কি কোথাও নথিভুক্ত? আমি boto3.amazonaws.com/v1/docamentation/api/latest/references/… এ দেখছিলাম এবং ভেবেছিলাম এটি কেবল বাইটসই গ্রহণ করেছে। আমি নিশ্চিত যে "সন্ধানযোগ্য ফাইল-জাতীয় বস্তু" ঠিক কী গঠন করে, তবে এটিতে স্ট্রিংগুলি অন্তর্ভুক্ত বলে মনে হয় না।
— এমা

আমি এটি ডাউনলোড_ফিলোবজ () এর সাথে তুলনা করতে পারি যা বড় মাল্টিপার্ট ফাইল আপলোডগুলির জন্য। আপলোড পদ্ধতিগুলির জন্য সন্ধানযোগ্য ফাইল অবজেক্টগুলির প্রয়োজন হয় , তবে রাখুন () আপনাকে বালতিতে কোনও ফাইলের জন্য সরাসরি স্ট্রিং লিখতে দেয় যা ল্যাম্বডা ফাংশনগুলির জন্য একটি এস 3 বালতিতে ফাইলগুলি গতিশীলভাবে তৈরি এবং লেখার জন্য সহজ।
— ফ্র্যাঙ্ক

28

এস 3 থেকে জেএসএন পড়ার জন্য এখানে একটি দুর্দান্ত কৌশল:

import json, boto3
s3 = boto3.resource("s3").Bucket("bucket")
json.load_s3 = lambda f: json.load(s3.Object(key=f).get()["Body"])
json.dump_s3 = lambda obj, f: s3.Object(key=f).put(Body=json.dumps(obj))

এখন আপনি json.load_s3এবং json.dump_s3হিসাবে একই API ব্যবহার করতে পারেন loadanddump

data = {"test":0}
json.dump_s3(data, "key") # saves json to s3://bucket/key
data = json.load_s3("key") # read json from s3://bucket/key

2
চমৎকার। কাজ এটি পেতে, আমি এই অতিরিক্ত বিট যোগ করেছেন: ...["Body"].read().decode('utf-8')।
— sedh

ভালো বুদ্ধি. যাইহোক, এটি নামকরণের উন্নতির জন্য কিছু জায়গা সরবরাহ করে।
— জান ভ্লিনকিনস্কি

এই দুর্দান্ত ধারণাটির প্রস্তাবিত পুনরায় লেখা: gist.github.com/vlcinsky/bbeda4321208aa98745afc29b58e90ac
— জান ভ্লিনকস্কি

12

একটি ক্লিনার এবং সংক্ষিপ্ত সংস্করণ যা আমি ফ্লাইতে প্রদত্ত এস 3 বালতি এবং সাব-ফোল্ডারে ফাইল আপলোড করতে ব্যবহার করি -

import boto3

BUCKET_NAME = 'sample_bucket_name'
PREFIX = 'sub-folder/'

s3 = boto3.resource('s3')

# Creating an empty file called "_DONE" and putting it in the S3 bucket
s3.Object(BUCKET_NAME, PREFIX + '_DONE').put(Body="")

নোট : আপনি সবসময় আপনার ডেস্কটপ AWS শংসাপত্রের (করা উচিত aws_access_key_idএবং aws_secret_access_keyএকটি পৃথক ফাইলে) নিদর্শন জন্য~/.aws/credentials


অ্যাডাব্লুএস শংসাপত্রগুলির ফাইলগুলির জন্য উইন্ডোজ সমতুল্য অবস্থান কী, যেহেতু উইন্ডোজ সমর্থন করবে না~
— হামমান স্যামুয়েল

1
@HammanSamuel তোমার মত এটা সংরক্ষণ করতে পারেC:\Users\username\.aws\credentials
— keV

1

এটি স্মার্ট- ওপেনটি উল্লেখ করার boto3মতো যা ব্যাক-এন্ড হিসাবে ব্যবহার করে ।

smart-openপাইথন এর জন্য একটি ড্রপ ইন প্রতিস্থাপন openযে থেকে ফাইল খুলতে পারে s3এবং সেইসাথে, ftp, httpএবং অনেক অন্যান্য প্রোটোকল।

উদাহরণ স্বরূপ

from smart_open import open
import json
with open("s3://your_bucket/your_key.json", 'r') as f:
    data = json.load(f)

আউস শংসাপত্রগুলি বোটো 3 শংসাপত্রগুলির মাধ্যমে লোড হয় , সাধারণত একটি ফাইল ~/.aws/ডিয়ার বা পরিবেশের পরিবর্তনশীল।


1
যদিও এই রেসোন তথ্যবহুল, তবুও এটি মূল প্রশ্নের উত্তর দেওয়ার পক্ষে না - যা কিছু বোটো পদ্ধতির বোটো 3 সমতুল্য কী।
— রবিনহুড91

1
স্মার্ট ওপেন বোটো 3 ব্যবহার করে
— উরি গোরেন

1

আপনি লিখতে নীচের কোডটি ব্যবহার করতে পারেন, উদাহরণস্বরূপ 2019 এ S3 তে একটি চিত্র S S3 এর সাথে সংযোগ স্থাপন করতে আপনাকে কমান্ড ব্যবহার করে AWS CLI ইনস্টল করতে হবে pip install awscli, তারপরে কমান্ডটি ব্যবহার করে কয়েকটি শংসাপত্র লিখুন aws configure:

import urllib3
import uuid
from pathlib import Path
from io import BytesIO
from errors import custom_exceptions as cex

BUCKET_NAME = "xxx.yyy.zzz"
POSTERS_BASE_PATH = "assets/wallcontent"
CLOUDFRONT_BASE_URL = "https://xxx.cloudfront.net/"


class S3(object):
    def __init__(self):
        self.client = boto3.client('s3')
        self.bucket_name = BUCKET_NAME
        self.posters_base_path = POSTERS_BASE_PATH

    def __download_image(self, url):
        manager = urllib3.PoolManager()
        try:
            res = manager.request('GET', url)
        except Exception:
            print("Could not download the image from URL: ", url)
            raise cex.ImageDownloadFailed
        return BytesIO(res.data)  # any file-like object that implements read()

    def upload_image(self, url):
        try:
            image_file = self.__download_image(url)
        except cex.ImageDownloadFailed:
            raise cex.ImageUploadFailed

        extension = Path(url).suffix
        id = uuid.uuid1().hex + extension
        final_path = self.posters_base_path + "/" + id
        try:
            self.client.upload_fileobj(image_file,
                                       self.bucket_name,
                                       final_path
                                       )
        except Exception:
            print("Image Upload Error for URL: ", url)
            raise cex.ImageUploadFailed

        return CLOUDFRONT_BASE_URL + id
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.