कैसे B3 का उपयोग कर S3 बाल्टी में निर्देशिका के लिए एक फ़ाइल अपलोड करने के लिए


107

मैं अजगर की मदद से s3 बाल्टी में एक फाइल कॉपी करना चाहता हूं।

Ex: मेरे पास बकेट नाम है = परीक्षण। और बाल्टी में, मेरे पास 2 फ़ोल्डर हैं जिनका नाम "डंप" और "इनपुट" है। अब मैं अजगर की मदद से स्थानीय निर्देशिका से एस 3 "डंप" फ़ोल्डर में एक फाइल कॉपी करना चाहता हूं ... क्या कोई मेरी मदद कर सकता है?

जवाबों:


105

इसे इस्तेमाल करे...

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)

[अद्यतन] मैं एक अजगर नहीं हूँ, इसलिए आयात के बयान के बारे में सिर के लिए धन्यवाद। इसके अलावा, मैं आपके अपने स्रोत कोड के अंदर क्रेडेंशियल्स रखने की अनुशंसा नहीं करूंगा। यदि आप AWS का उपयोग इंस्टेंस प्रोफाइल ( http://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ecre_instance-profiles.html ) के साथ IAM क्रेडेंशियल्स के अंदर कर रहे हैं , और उसी व्यवहार को बनाए रखने के लिए आपका देव / टेस्ट वातावरण, AdRoll से होलोग्राम की तरह कुछ का उपयोग करें ( https://github.com/AdRoll/hologramram )


8
मैं कई आयात लाइनों से बचूंगा, न कि पायथोनिक। आयात लाइनों को शीर्ष पर ले जाएं, और बोटो के लिए, आप boto.s3.connection आयात S3nonnection से उपयोग कर सकते हैं; con = S3Connection (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY); bucket = conn.create_bucket (bucketname ...); bucket.new_key (keyname, ...)। set_contents_from_filename ....
cgseller

2
boto.s3.key.Key 1.7.12 पर मौजूद नहीं है
एलेक्स पावी

अप्रैल 2020 के रूप में अद्यतन इस लिंक का पालन करें upload_file_to_s3_using_python
प्रयाग शर्मा

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 फ़ाइलों के लिए आपको chunked का उपयोग करना पड़ सकता है। elastician.com/2010/12/s3-multipart-upload-in-boto.html
cgseller

2
हां .. कम जटिल और आमतौर पर इस्तेमाल किया जाने वाला अभ्यास
लियो प्रिंस

1
मैंने यह कोशिश की, यह काम नहीं करता है, लेकिन k.set_contents_from_filename (testfile, cb = प्रतिशत_cb, num_cb = 10) करता है
शमौन

1
क्या आप बोटो 2 पर हैं, नवीनतम? वैसे भी, set_contents_from_filename एक और भी सरल विकल्प है। इसका लाभ उठाएं !
vcarel

3
key.set_contents_from_filename('some_file.zip')यहां भी काम करेंगे। देखें डॉक । Boto3 के लिए संबंधित कोड यहां पाया जा सकता है
ग्रेग सैडेत्स्की

44
import boto3

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

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

क्या आप इस लाइन को समझा सकते हैं s3.Bucket (BUCKET) .upload_file ("आपका / स्थानीय / फ़ाइल", "डंप / फ़ाइल")
venkat

@venkat "your / local / file" एक फ़ाइलपथ है जैसे कि कंप्यूटर पर "/home/file.txt", जो python / boto का उपयोग कर रहा है और "डंप / फाइल" S3 बकेट में फ़ाइल को स्टोर करने के लिए एक प्रमुख नाम है। देखें: boto3.readthedocs.io/en/latest/reference/services/…
जोश एस।

1
ऐसा लगता है कि उपयोगकर्ता ने AWS कुंजी को पूर्व-कॉन्फ़िगर किया हुआ है, ऐसा करने के लिए अपनी एनाकोंडा कमांड प्रॉम्प्ट खोलें और टाइप करें aws configure, अपनी जानकारी दर्ज करें और आप स्वचालित रूप से boto3 के साथ जुड़ जाएंगे। चेक करें boto3.readthedocs.io/en/latest/guide/quickstart.html
Seeiespi

सरलतम समाधान IMO, टिनि 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/


मुझे नहीं लगता कि यह बड़ी फ़ाइलों के लिए काम करता है। मुझे इसका उपयोग करना था: docs.pythonboto.org/en/latest/s3_tut.html#storing-large-data
wordsforthewise

यह भी मुझे इस तय करने के लिए नेतृत्व किया: github.com/boto/boto/issues/2207#issuecomment-60682869 और इस: stackoverflow.com/questions/5396932/…
wordsforthewise

6
चूंकि टिनि 3 प्रोजेक्ट को छोड़ दिया गया है इसलिए आपको इसका उपयोग नहीं करना चाहिए। github.com/smore-inc/tinys3/issues/45
हैल कास्कावलसी

यह फ्लैट 2019 में मेरे लिए अब काम नहीं करता था। टिनि 3 को अभी छोड़ा नहीं गया है ... मुझे नहीं लगता कि यह अब और काम करता है। किसी और के लिए, जो यह कोशिश करने का फैसला करता है, अगर आपको 403 त्रुटियां मिलती हैं तो आश्चर्यचकित न हों। एक सरल boto3.clientसमाधान (जैसे मनीष मेहरा का जवाब) हालांकि तुरंत काम किया।
रस

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)

फ़ाइलपथ क्या है और फ़ोल्डर_नाम + फ़ाइल नाम क्या है? यह भ्रमित करने वाला है
कोलिंटोबिंग

@colintobing फ़ाइलपथ क्लस्टर और folder_name / फ़ाइलनाम पर फ़ाइल का पथ है जिसका नामकरण सम्मेलन है जिसे आप s3 बाल्टी के अंदर करना चाहते हैं
मनीष मेहरा

2
@ManishMehra जवाब बेहतर होगा यदि आपने इसे कॉलिंटोबिंग के भ्रम की स्थिति को स्पष्ट करने के लिए संपादित किया; डॉक्स की जांच किए बिना यह स्पष्ट है कि कौन से पैरामीटर स्थानीय रास्तों का संदर्भ देते हैं और कौन से डॉक्स की जाँच किए बिना डॉक्स या टिप्पणियों को पढ़े बिना। (एक बार यह हो, तो आप फ़्लैग यहाँ सभी टिप्पणियों, पर्ज बाद से वे अप्रचलित हो जाएगा करने के लिए कर सकते हैं।)
मार्क Amery

aws_access_key_idऔर aws_secret_access_keyAWS सीएलआई के साथ भी कॉन्फ़िगर किया जा सकता है और स्क्रिप्ट से बाहर संग्रहीत किया जा सकता है ताकि `ग्राहक = boto3.client ('s3') को बुलाया जा सके
yvesva

16

क्रेडेंशियल के साथ सत्र के भीतर फाइल को s3 में अपलोड करें।

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_output_key क्या है?
Roelant

यह S3 बाल्टी में फ़ाइल नाम है।
रोमन ऑर्क

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"   

7

यह तीन लाइनर है। बस boto3 प्रलेखन पर दिए गए निर्देशों का पालन करें ।

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) - उस का नाम जिसे आप अपनी फ़ाइल में अपने s3 बाल्टी में असाइन करना चाहते हैं। यह फ़ाइल के नाम या आपकी पसंद के किसी भिन्न नाम के समान हो सकता है, लेकिन फ़िलेटाइप समान रहना चाहिए।

    नोट: मुझे लगता है कि आपने एक ~\.awsफ़ोल्डर में अपनी साख बचा ली है जैसा कि boto3 प्रलेखन में सर्वोत्तम कॉन्फ़िगरेशन प्रथाओं में सुझाया गया है


  • धन्यवाद Nde सैमुअल, जो मेरे साथ काम करता था ... मेरे मामले में एक चीज जो अतिरिक्त आवश्यक थी, वह थी "बाल्टी पहले से ही बनाई गई थी," "निर्दिष्ट बाल्टी मौजूद नहीं है" की त्रुटि से बचने के लिए।
    हसनशाहजी 16३५16१६१

    @ HassanSh__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/documentation/api/latest/guide/s3-uploading-files.html


    1

    निम्नलिखित कोड और S3 फ़ोल्डर चित्र के रूप में अपलोड फ़ोल्डर उदाहरण के लिए यहां छवि विवरण दर्ज करें

    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
    
    

    यहां तीन महत्वपूर्ण चर हैं, BUCKET const, file_to_upload और file_name

    BUCKET: आपके S3 बाल्टी का नाम है

    file_to_upload_path: उस फ़ाइल से पथ होना चाहिए जिसे आप अपलोड करना चाहते हैं

    file_name: आपकी बाल्टी में परिणामी फ़ाइल और पथ है (यह वह जगह है जहाँ आप फ़ोल्डर जोड़ते हैं या कभी भी)

    कई तरीके हैं लेकिन आप इस कोड को इस तरह से किसी अन्य स्क्रिप्ट में पुन: उपयोग कर सकते हैं

    import S3
    
    def some_function():
        S3.S3().upload_file(path_to_file, final_file_name)
    हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
    Licensed under cc by-sa 3.0 with attribution required.