বোটো ব্যবহার করে কীভাবে এস 3 বাল্টিতে ডিরেক্টরিতে কোনও ফাইল আপলোড করবেন


111

আমি পাইথন ব্যবহার করে এস 3 বালতিতে একটি ফাইল অনুলিপি করতে চাই।

উদাঃ আমার বালতির নাম = পরীক্ষা আছে। এবং বালতিতে আমার কাছে দুটি ফোল্ডারের নাম "ডাম্প" এবং "ইনপুট" রয়েছে। এখন আমি পাইথন ব্যবহার করে স্থানীয় ডিরেক্টরি থেকে এস 3 "ডাম্প" ফোল্ডারে একটি ফাইল অনুলিপি করতে চাই ... কেউ কি আমাকে সহায়তা করতে পারেন?

উত্তর:


106

এটা চেষ্টা কর...

import boto
import boto.s3
import sys
from boto.s3.key import Key

AWS_ACCESS_KEY_ID = ''
AWS_SECRET_ACCESS_KEY = ''

bucket_name = AWS_ACCESS_KEY_ID.lower() + '-dump'
conn = boto.connect_s3(AWS_ACCESS_KEY_ID,
        AWS_SECRET_ACCESS_KEY)


bucket = conn.create_bucket(bucket_name,
    location=boto.s3.connection.Location.DEFAULT)

testfile = "replace this with an actual filename"
print 'Uploading %s to Amazon S3 bucket %s' % \
   (testfile, bucket_name)

def percent_cb(complete, total):
    sys.stdout.write('.')
    sys.stdout.flush()


k = Key(bucket)
k.key = 'my test file'
k.set_contents_from_filename(testfile,
    cb=percent_cb, num_cb=10)

[আপডেট] আমি পাইথোনিস্ট নই, তাই আমদানি বিবৃতি সম্পর্কে মাথা ঘামানোর জন্য ধন্যবাদ। এছাড়াও, আমি নিজের উত্স কোডের মধ্যে শংসাপত্র রাখার প্রস্তাব দিই না। আপনি যদি এডব্লিউএসের অভ্যন্তরে এটি চালাচ্ছেন তবে ইনস্ট্যান্স প্রোফাইলগুলির সাথে আইএএম শংসাপত্রগুলি ব্যবহার করুন ( http://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2_instance-profiles.html ), এবং একই আচরণ রাখার জন্য আপনার দেব / পরীক্ষার পরিবেশ, অ্যাড্রোল থেকে হলোগ্রামের মতো কিছু ব্যবহার করুন ( https://github.com/AdRoll/hologram )


8
আমি পাইথোনিক নয়, একাধিক আমদানি লাইন এড়াতে চাই। শীর্ষে আমদানি লাইনগুলি সরান, এবং বোটোর জন্য, আপনি বোটো.এস 3 সংযোগ আমদানি এস 3 সংযোগ থেকে ব্যবহার করতে পারেন; সংযোগ = এস 3 সংযোগ (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY); বালতি = conn.create_bucket (বালতি নাম ...); bucket.new_key (কীনাম, ...)। সেট_সামগ্রী_ফর্ম_ফিলনাম ....
cgseller

4
boto.s3.key.Key 1.7.12 এ বিদ্যমান নেই
অ্যালেক্স পাভি

এপ্রিল ২০২০ অনুসারে আপডেট করুন এই লিঙ্কটি অনুসরণ করুন আপলোড_ফাইলে_ টো এস এস_সুলভ_পিথন
প্রয়াগ শর্মা

48

এটিকে জটিল করার দরকার নেই:

s3_connection = boto.connect_s3()
bucket = s3_connection.get_bucket('your bucket name')
key = boto.s3.key.Key(bucket, 'some_file.zip')
with open('some_file.zip') as f:
    key.send_file(f)

এটি কাজ করবে, তবে বৃহত্তর .zip ফাইলগুলির জন্য আপনাকে খণ্ডিত ব্যবহার করতে হতে পারে। ইলাস্টিকান.
com

4
হ্যাঁ ... কম জটিল এবং সাধারণভাবে ব্যবহৃত অনুশীলন
লিও প্রিন্স

4
আমি এটি চেষ্টা করেছিলাম, এটি কাজ করে না, তবে কে.সেট_কন্টেন্টস_ফর্ম_ফাইলেন (টেস্টফিল, সিবি = শতাংশ_সিবি, নাম_সিবি = 10) করে
সাইমন

4
আপনি সর্বশেষে বোটো 2 এ আছেন? যাইহোক, set_contents_from_filename একটি আরও সহজ বিকল্প। এটার জন্য যাও !
ভেকেরেল

4
key.set_contents_from_filename('some_file.zip')এখানে কাজ করবে। ডক দেখুন । বোটো 3 এর জন্য সংশ্লিষ্ট কোডটি এখানে পাওয়া যাবে
গ্রেগ সাদেটস্কি

46
import boto3

s3 = boto3.resource('s3')
BUCKET = "test"

s3.Bucket(BUCKET).upload_file("your/local/file", "dump/file")

আপনি এই লাইন s3.Bucket (বালতি) .upload_file ( "আপনার / স্থানীয় / ফাইল", "ডাম্প / ফাইল") ব্যাখ্যা করতে পারেন
ভেঙ্কট

@ ভেনক্যাট "আপনার / স্থানীয় / ফাইল" একটি পাইপথান যেমন কম্পিউটারে "/home/file.txt" পাইথন / বোটো ব্যবহার করে এবং "ডাম্প / ফাইল" এস 3 বাল্টির নীচে ফাইল সংরক্ষণ করার জন্য একটি মূল নাম। দেখুন: boto3.readthedocs.io/en/latest/references/services/…
জোশ এস

4
দেখে মনে হচ্ছে যে ব্যবহারকারী এডাব্লুএস কীগুলি প্রাক-কনফিগার করেছেন, এটি করতে আপনার অ্যানাকোন্ডা কমান্ড প্রম্পটটি খোলার জন্য টাইপ করুন aws configure, আপনার তথ্য লিখুন এবং আপনি স্বয়ংক্রিয়ভাবে বোটো 3 এর সাথে সংযোগ স্থাপন করবেন। পরীক্ষা করে দেখুন boto3.readthedocs.io/en/latest/guide/quickstart.html
seeiespi

সহজ সমাধান আইএমও, টিনি 3 এর মতোই সহজ তবে অন্য বাহ্যিক নির্ভরতার প্রয়োজন ছাড়াই। aws configureআপনার জীবন আরও সহজ করার জন্য সময়ের সাথে আপনার AWS কীগুলি সেট আপ করার জন্য অত্যন্ত পরামর্শ দিন ।
বার্লেনসডাউন

শংসাপত্রগুলিতে একাধিক প্রোফাইল থাকলে কী হয়। নির্দিষ্ট শংসাপত্রগুলি কীভাবে পাস করবেন
তারা প্রসাদ গুরুং

36

আমি এটি ব্যবহার করেছি এবং এটি প্রয়োগ করা খুব সহজ

import tinys3

conn = tinys3.Connection('S3_ACCESS_KEY','S3_SECRET_KEY',tls=True)

f = open('some_file.zip','rb')
conn.upload('some_file.zip',f,'my_bucket')

https://www.smore.com/labs/tinys3/


আমি মনে করি না এটি বড় ফাইলগুলির জন্য কাজ করে। আমাকে এটি ব্যবহার করতে হয়েছিল: ডকস.পিথনবোটো.অর্গ /en/latest/s3_tut.html#store-large-data
কথার আগেই

এছাড়াও এই সমাধানের জন্য আমাকে নেতৃত্বে যে: github.com/boto/boto/issues/2207#issuecomment-60682869 এবং এই: stackoverflow.com/questions/5396932/...
wordsforthewise

6
যেহেতু tinys3 প্রকল্পটি পরিত্যক্ত তাই আপনার এটি ব্যবহার করা উচিত নয়। github.com/smore-inc/tinys3/issues/45
হালিল কাসকাভালি

এই ফ্ল্যাট আউটটি 2019 সালে আর আমার পক্ষে কাজ করে নি t টিনিস 3 কেবল পরিত্যক্ত নয় ... আমার মনে হয় না এটি আর কাজ করে। অন্য যে কেউ এটি চেষ্টা করার সিদ্ধান্ত নেয়, আপনি যদি 403 ত্রুটি পেয়ে থাকেন তবে অবাক হবেন না। boto3.clientযদিও একটি সহজ সমাধান (মণীশ মেহরার উত্তর মত) অবিলম্বে কাজ করেছে worked
রুশ

16
from boto3.s3.transfer import S3Transfer
import boto3
#have all the variables populated which are required below
client = boto3.client('s3', aws_access_key_id=access_key,aws_secret_access_key=secret_key)
transfer = S3Transfer(client)
transfer.upload_file(filepath, bucket_name, folder_name+"/"+filename)

ফাইলপথ কী এবং ফোল্ডার_নাম + ফাইলের নাম কী? এটি বিভ্রান্তিকর
কলিনটোবিং

ক্লিন্টোবাইং ফাইলপথটি ক্লাস্টারে ফাইলের পথ এবং ফোল্ডার_নাম / ফাইলনাম হল নামকরণ কনভেনশন যা আপনি s3 বালতির ভিতরে রাখতে চান
মনীশ মেহরা

4
@ মণীশমেহরা উত্তরটি কোলিনটোবিংয়ের বিভ্রান্তির বিষয়টি স্পষ্ট করতে সম্পাদনা করলে উত্তরটি আরও ভাল হবে; কোন দস্তাবেজগুলি স্থানীয় পাথগুলিকে বোঝায় এবং কোনটি এস -3 পাথগুলিতে ডক্স পরীক্ষা না করে বা মন্তব্যগুলি না পড়ে ডক্স পরীক্ষা না করে এটি স্পষ্ট। (এটি হয়ে গেলে, আপনি এখানে সমস্ত মন্তব্য মুছে ফেলার জন্য পতাকাঙ্কিত করতে পারেন, যেহেতু সেগুলি অচল হয়ে যাবে))
মার্ক অ্যামেরি

aws_access_key_idএবং aws_secret_access_keyএডাব্লুএস সিএলআই-এর সাথে কনফিগার করা যায় এবং স্ক্রিপ্টের বাইরে সংরক্ষণ করা যায় যাতে :3 ক্লায়েন্ট = বোটো3.ক্লিয়েন্ট ('এস 3') বলা যেতে পারে
yvesva

16

শংসাপত্র সহ একটি সেশনের মধ্যে এস 3-তে ফাইল আপলোড করুন।

import boto3

session = boto3.Session(
    aws_access_key_id='AWS_ACCESS_KEY_ID',
    aws_secret_access_key='AWS_SECRET_ACCESS_KEY',
)
s3 = session.resource('s3')
# Filename - File to upload
# Bucket - Bucket to upload to (the top level directory under AWS S3)
# Key - S3 object name (can contain subdirectories). If not specified then file_name is used
s3.meta.client.upload_file(Filename='input_file_path', Bucket='bucket_name', Key='s3_output_key')

S3_ আউটপুট_কি কী?
রোলেেন্ট

এটি এস 3 বালতির ফাইল নাম।
রোমান ওরাক

12

এটিও কাজ করবে:

import os 
import boto
import boto.s3.connection
from boto.s3.key import Key

try:

    conn = boto.s3.connect_to_region('us-east-1',
    aws_access_key_id = 'AWS-Access-Key',
    aws_secret_access_key = 'AWS-Secrete-Key',
    # host = 's3-website-us-east-1.amazonaws.com',
    # is_secure=True,               # uncomment if you are not using ssl
    calling_format = boto.s3.connection.OrdinaryCallingFormat(),
    )

    bucket = conn.get_bucket('YourBucketName')
    key_name = 'FileToUpload'
    path = 'images/holiday' #Directory Under which file should get upload
    full_key_name = os.path.join(path, key_name)
    k = bucket.new_key(full_key_name)
    k.set_contents_from_filename(key_name)

except Exception,e:
    print str(e)
    print "error"   

9

এটি একটি তিন লাইনার। কেবল বোটো 3 ডকুমেন্টেশনের নির্দেশাবলী অনুসরণ করুন ।

import boto3
s3 = boto3.resource(service_name = 's3')
s3.meta.client.upload_file(Filename = 'C:/foo/bar/baz.filetype', Bucket = 'yourbucketname', Key = 'baz.filetype')

কিছু গুরুত্বপূর্ণ যুক্তি হ'ল:

পরামিতি:

  • ফাইলের নাম ( str) - আপলোড করার জন্য ফাইলের পথ।
  • বালতি ( str) - আপলোড করার বালতিটির নাম।
  • কী ( str) - আপনি নিজের ফাইলটি আপনার এস 3 বালতিতে বরাদ্দ করতে চান তার নাম। এটি ফাইলের নাম বা আপনার পছন্দের ভিন্ন নামের মতো হতে পারে তবে ফাইল টাইপটি একই থাকবে।

    দ্রষ্টব্য: আমি ধরে নিয়েছি যে আপনি বোটো 3 ডকুমেন্টেশনের সেরা কনফিগারেশন অনুশীলনের~\.aws পরামর্শ অনুসারে কোনও ফোল্ডারে আপনার শংসাপত্রগুলি সংরক্ষণ করেছেন ।


  • আপনাকে ধন্যবাদ এনডি স্যামুয়েল, যা আমার সাথে কাজ করেছিল ... আমার ক্ষেত্রে অতিরিক্ত যেটি প্রয়োজন ছিল তা ছিল বালতিটি ইতিমধ্যে তৈরি করা হয়েছিল, "" নির্দিষ্ট বালতিটি উপস্থিত নেই "" এর ত্রুটি এড়াতে "।
    হাসানএসএইচ__3571619

    @ হাসানএসএইচ__3571619 আমি আনন্দিত যে এটি সাহায্য করেছে।
    স্যামুয়েল এনডি

    5
    import boto
    from boto.s3.key import Key
    
    AWS_ACCESS_KEY_ID = ''
    AWS_SECRET_ACCESS_KEY = ''
    END_POINT = ''                          # eg. us-east-1
    S3_HOST = ''                            # eg. s3.us-east-1.amazonaws.com
    BUCKET_NAME = 'test'        
    FILENAME = 'upload.txt'                
    UPLOADED_FILENAME = 'dumps/upload.txt'
    # include folders in file path. If it doesn't exist, it will be created
    
    s3 = boto.s3.connect_to_region(END_POINT,
                               aws_access_key_id=AWS_ACCESS_KEY_ID,
                               aws_secret_access_key=AWS_SECRET_ACCESS_KEY,
                               host=S3_HOST)
    
    bucket = s3.get_bucket(BUCKET_NAME)
    k = Key(bucket)
    k.key = UPLOADED_FILENAME
    k.set_contents_from_filename(FILENAME)
    

    4

    বোটো 3 ব্যবহার করা হচ্ছে

    import logging
    import boto3
    from botocore.exceptions import ClientError
    
    
    def upload_file(file_name, bucket, object_name=None):
        """Upload a file to an S3 bucket
    
        :param file_name: File to upload
        :param bucket: Bucket to upload to
        :param object_name: S3 object name. If not specified then file_name is used
        :return: True if file was uploaded, else False
        """
    
        # If S3 object_name was not specified, use file_name
        if object_name is None:
            object_name = file_name
    
        # Upload the file
        s3_client = boto3.client('s3')
        try:
            response = s3_client.upload_file(file_name, bucket, object_name)
        except ClientError as e:
            logging.error(e)
            return False
        return True
    

    আরও জন্য: - https://boto3.amazonaws.com/v1/docamentation/api/latest/guide/s3-uploading-files.html


    2

    নিম্নলিখিত কোড এবং এস 3 ফোল্ডার চিত্র হিসাবে ফোল্ডারের উদাহরণ আপলোড করার জন্য এখানে চিত্র বর্ণনা লিখুন

    import boto
    import boto.s3
    import boto.s3.connection
    import os.path
    import sys    
    
    # Fill in info on data to upload
    # destination bucket name
    bucket_name = 'willie20181121'
    # source directory
    sourceDir = '/home/willie/Desktop/x/'  #Linux Path
    # destination directory name (on s3)
    destDir = '/test1/'   #S3 Path
    
    #max size in bytes before uploading in parts. between 1 and 5 GB recommended
    MAX_SIZE = 20 * 1000 * 1000
    #size of parts when uploading in parts
    PART_SIZE = 6 * 1000 * 1000
    
    access_key = 'MPBVAQ*******IT****'
    secret_key = '11t63yDV***********HgUcgMOSN*****'
    
    conn = boto.connect_s3(
            aws_access_key_id = access_key,
            aws_secret_access_key = secret_key,
            host = '******.org.tw',
            is_secure=False,               # uncomment if you are not using ssl
            calling_format = boto.s3.connection.OrdinaryCallingFormat(),
            )
    bucket = conn.create_bucket(bucket_name,
            location=boto.s3.connection.Location.DEFAULT)
    
    
    uploadFileNames = []
    for (sourceDir, dirname, filename) in os.walk(sourceDir):
        uploadFileNames.extend(filename)
        break
    
    def percent_cb(complete, total):
        sys.stdout.write('.')
        sys.stdout.flush()
    
    for filename in uploadFileNames:
        sourcepath = os.path.join(sourceDir + filename)
        destpath = os.path.join(destDir, filename)
        print ('Uploading %s to Amazon S3 bucket %s' % \
               (sourcepath, bucket_name))
    
        filesize = os.path.getsize(sourcepath)
        if filesize > MAX_SIZE:
            print ("multipart upload")
            mp = bucket.initiate_multipart_upload(destpath)
            fp = open(sourcepath,'rb')
            fp_num = 0
            while (fp.tell() < filesize):
                fp_num += 1
                print ("uploading part %i" %fp_num)
                mp.upload_part_from_file(fp, fp_num, cb=percent_cb, num_cb=10, size=PART_SIZE)
    
            mp.complete_upload()
    
        else:
            print ("singlepart upload")
            k = boto.s3.key.Key(bucket)
            k.key = destpath
            k.set_contents_from_filename(sourcepath,
                    cb=percent_cb, num_cb=10)
    

    PS: আরও রেফারেন্স URL এর জন্য


    0
    xmlstr = etree.tostring(listings,  encoding='utf8', method='xml')
    conn = boto.connect_s3(
            aws_access_key_id = access_key,
            aws_secret_access_key = secret_key,
            # host = '<bucketName>.s3.amazonaws.com',
            host = 'bycket.s3.amazonaws.com',
            #is_secure=False,               # uncomment if you are not using ssl
            calling_format = boto.s3.connection.OrdinaryCallingFormat(),
            )
    conn.auth_region_name = 'us-west-1'
    
    bucket = conn.get_bucket('resources', validate=False)
    key= bucket.get_key('filename.txt')
    key.set_contents_from_string("SAMPLE TEXT")
    key.set_canned_acl('public-read')
    

    আপনার কোডটি যা করে তা একটি পাঠ্য বিবরণ সুন্দর হবে!
    নিক

    0

    আমার কাছে এমন কিছু আছে যা দেখে মনে হচ্ছে আমার আরও কিছুটা অর্ডার রয়েছে:

    import boto3
    from pprint import pprint
    from botocore.exceptions import NoCredentialsError
    
    
    class S3(object):
        BUCKET = "test"
        connection = None
    
        def __init__(self):
            try:
                vars = get_s3_credentials("aws")
                self.connection = boto3.resource('s3', 'aws_access_key_id',
                                                 'aws_secret_access_key')
            except(Exception) as error:
                print(error)
                self.connection = None
    
    
        def upload_file(self, file_to_upload_path, file_name):
            if file_to_upload is None or file_name is None: return False
            try:
                pprint(file_to_upload)
                file_name = "your-folder-inside-s3/{0}".format(file_name)
                self.connection.Bucket(self.BUCKET).upload_file(file_to_upload_path, 
                                                                          file_name)
                print("Upload Successful")
                return True
    
            except FileNotFoundError:
                print("The file was not found")
                return False
    
            except NoCredentialsError:
                print("Credentials not available")
                return False
    
    
    

    তিনটি গুরুত্বপূর্ণ এখানে ভেরিয়েবল, করছি বালতি const, file_to_upload এবং FILE_NAME

    BUCKET: আপনার এস 3 বালতির নাম

    file_to_upload_path: আপনি যে ফাইলটি আপলোড করতে চান তা হতে হবে

    file_name: আপনার বালতিতে ফলাফল ফাইল এবং পথ (এটি যেখানে আপনি ফোল্ডার যুক্ত করেন বা যা কখনও)

    অনেক উপায় আছে তবে আপনি এই কোডটি অন্য স্ক্রিপ্টে এই জাতীয় পুনরায় ব্যবহার করতে পারেন

    import S3
    
    def some_function():
        S3.S3().upload_file(path_to_file, final_file_name)
    

    0

    ফাইল অ্যাক্সেসের সমস্যা বাদ দিতে আপনার সামগ্রীর ধরণের উল্লেখ করতে হবে।

    import os
    image='fly.png'
    s3_filestore_path = 'images/fly.png'
    filename, file_extension = os.path.splitext(image)
    content_type_dict={".png":"image/png",".html":"text/html",
                   ".css":"text/css",".js":"application/javascript",
                   ".jpg":"image/png",".gif":"image/gif",
                   ".jpeg":"image/jpeg"}
    
    content_type=content_type_dict[file_extension]
    s3 = boto3.client('s3', config=boto3.session.Config(signature_version='s3v4'),
                      region_name='ap-south-1',
                      aws_access_key_id=S3_KEY,
                      aws_secret_access_key=S3_SECRET)
    s3.put_object(Body=image, Bucket=S3_BUCKET, Key=s3_filestore_path, ContentType=content_type)
    

    0

    আপনি যদি আউস কমান্ড লাইন ইন্টারফেস আপনার সিস্টেমে ইনস্টল আপনি অজগর ব্যবহার করতে পারেন subprocess গ্রন্থাগার। উদাহরণ স্বরূপ:

    import subprocess
    def copy_file_to_s3(source: str, target: str, bucket: str):
       subprocess.run(["aws", "s3" , "cp", source, f"s3://{bucket}/{target}"])
    

    তেমনি আপনি এই লজিকসটি সকল ধরণের এডাব্লুএস ক্লায়েন্ট অপারেশনের জন্য ব্যবহার করতে পারেন যেমন ফাইলগুলি ডাউনলোড করা বা তালিকাবদ্ধ করা ইত্যাদি ইত্যাদি ফেরতের মানগুলি পাওয়াও সম্ভব। এইভাবে বোটো 3 আমদানি করার দরকার নেই। আমি অনুমান করি যে এর ব্যবহারটি সেভাবে উদ্দেশ্য নয় তবে অনুশীলনে আমি এটি সেভাবে বেশ সুবিধাজনক বলে মনে করি। এইভাবে আপনি আপনার কনসোলটিতে প্রদর্শিত আপলোডের স্থিতিও পাবেন - উদাহরণস্বরূপ:

    Completed 3.5 GiB/3.5 GiB (242.8 MiB/s) with 1 file(s) remaining
    

    আপনার ইচ্ছাকে আমি মধ্যে একটি বর্ণন থাকার সুপারিশ করা পদ্ধতি পরিবর্তন করতে subprocess রেফারেন্স সেইসাথে করার ডেস্কটপ AWS CLI রেফারেন্স

    দ্রষ্টব্য: এটি আমার উত্তরটির একটি অনুলিপি অনুরূপ প্রশ্নের

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