বোটো 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.