Boto kullanarak S3 klasöründeki dizine dosya nasıl yüklenir


107

Python kullanarak s3 kovasındaki bir dosyayı kopyalamak istiyorum.

Ör: Grup adı = testim var. Ve pakette, "döküm" ve "giriş" adlarında 2 klasörüm var. Şimdi python kullanarak yerel dizinden S3 "döküm" klasörüne bir dosya kopyalamak istiyorum ... Biri bana yardımcı olabilir mi?

Yanıtlar:


105

Bunu dene...

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)

[GÜNCELLEME] Ben bir pythonist değilim, bu yüzden içe aktarma ifadeleriyle ilgili uyarılar için teşekkürler. Ayrıca, kimlik bilgilerini kendi kaynak kodunuzun içine yerleştirmenizi önermem. Bunu AWS içinde çalıştırıyorsanız, Örnek Profilleriyle IAM Kimlik Bilgilerini kullanın ( http://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2_instance-profiles.html ) ve aynı davranışı Geliştirme / Test ortamınız, AdRoll'dan Hologram gibi bir şey kullanın ( https://github.com/AdRoll/hologram )


8
Pythonic değil, çoklu ithalat satırlarından kaçınırdım. İçe aktarma satırlarını en üste taşıyın ve boto için boto.s3.connection'dan kullanabilirsiniz import S3Connection; conn = S3Connection (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY); kova = conn.create_bucket (paket adı ...); buck.new_key (keyname, ...). set_contents_from_filename ....
cgseller

2
boto.s3.key.Key 1.7.12 tarihinde mevcut değil
Alex Pavy

nisan 2020 itibariyle güncelle bu bağlantıyı takip et upload_file_to_s3_using_python
Prayag Sharma

48

Bu kadar karmaşık hale getirmeye gerek yok:

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)

Bu işe yarayacaktır, ancak büyük .zip dosyaları için yığın halinde kullanmanız gerekebilir. elastikian.com/2010/12/s3-multipart-upload-in-boto.html
cgseller

2
Evet .. daha az karmaşık ve yaygın olarak kullanılan pratik
Leo Prince

1
Bunu denedim, işe yaramıyor, ancak k.set_contents_from_filename (testfile, cb = percent_cb, num_cb = 10) yapıyor
Simon

1
En son boto 2'de misin? Her neyse, set_contents_from_filename daha da basit bir seçenektir. Göreyim seni !
vcarel

3
key.set_contents_from_filename('some_file.zip')burada da çalışırdı. Doc'a bakın . Boto3 için ilgili kod burada bulunabilir .
Greg Sadetsky

45
import boto3

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

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

s3.Bucket (BUCKET) .upload_file ("sizin / yerel / dosyanız", "döküm / dosya")
venkat

@venkat "/ yerel / dosyanız" python / boto kullanan bilgisayardaki "/home/file.txt" gibi bir dosya yoludur ve "döküm / dosya", dosyayı S3 Bucket altında depolamak için bir anahtar adıdır. Bakınız: boto3.readthedocs.io/en/latest/reference/services/…
Josh S.

1
Görünüşe göre kullanıcının önceden yapılandırılmış AWS Anahtarları var, bunu yapmak için anaconda komut isteminizi açın ve yazın aws configure, bilgilerinizi girin ve otomatik olarak boto3'e bağlanacaksınız. Kontrol boto3.readthedocs.io/en/latest/guide/quickstart.html
seeiespi

En basit çözüm IMO, tinys3 kadar kolay ancak başka bir harici bağımlılığa ihtiyaç duymadan. Ayrıca aws configurehayatınızı kolaylaştırmak için AWS anahtarlarınızı önceden kurmanızı şiddetle tavsiye edin.
barlaensdoonn

Kimlik bilgilerinde birden fazla profil olduğunda ne olur? belirli kimlik bilgileri nasıl
geçilir

36

Bunu kullandım ve uygulaması çok basit

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/


Bunun büyük dosyalar için çalıştığını sanmıyorum. Bunu kullanmak zorunda kaldım: docs.pythonboto.org/en/latest/s3_tut.html#storing-large-data
wordsforthewise


6
Tinys3 projesi terk edildiği için bunu kullanmamalısınız. github.com/smore-inc/tinys3/issues/45
Halil Kaskavalci

Bu daire 2019'da artık benim için işe yaramadı. Tinys3 sadece terk edilmiş değil ... Artık çalıştığını düşünmüyorum. Bunu denemeye karar veren başka biri için 403 hatası alırsanız şaşırmayın. Yine de basit bir boto3.clientçözüm (Manish Mehra'nın cevabı gibi) hemen işe yaradı.
Russ

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)

dosya yolu nedir ve klasör_adı + dosya adı nedir? kafa karıştırıcı
colintobing

@colintobing dosya yolu, küme üzerindeki dosyanın yoludur ve klasör_adı / dosya adı, s3 klasöründe olmasını isteyeceğiniz adlandırma kuralıdır
Manish Mehra

2
@ManishMehra Colintobing'in kafa karışıklığını açıklığa kavuşturmak için cevabı düzenlerseniz daha iyi olur; Dokümanları kontrol etmeden veya yorumları okumadan hangi parametrelerin yerel yollara ve hangilerinin S3 yollarına atıfta bulunduğunu kontrol etmeden açık değildir. (Bu tamamlandıktan sonra, eski olacaklarından buradaki tüm yorumların silinmesi için işaretleyebilirsiniz.)
Mark Amery

aws_access_key_idve aws_secret_access_keyayrıca AWS CLI ile yapılandırılabilir ve komut dosyası dışında depolanabilir, böylece "client = boto3.client ('s3') çağrılabilir
yvesva

16

Kimlik bilgileriyle bir oturumda s3'e dosya yükleyin.

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 nedir?
Roelant

S3 klasöründeki dosya adıdır.
Roman Orac

12

Bu da işe yarayacak:

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

Bu üç astarlıdır. Sadece boto3 belgelerindeki talimatları takip edin .

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

Bazı önemli argümanlar:

Parametreler:

  • Dosya adı ( str) - Yüklenecek dosyanın yolu.
  • Paket ( str) - Yüklenecek paketin adı.
  • Anahtar ( str) - s3 paketinizdeki dosyanıza atamak istediğinizin adı. Bu, dosyanın adıyla aynı veya seçtiğiniz farklı bir ad olabilir, ancak dosya türü aynı kalmalıdır.

    Not: Kimlik bilgilerinizi boto3 belgelerindeki en iyi yapılandırma uygulamalarında~\.aws önerildiği gibi bir klasöre kaydettiğinizi varsayıyorum .


  • Teşekkürler, benimle çalışan Nde Samuel ... Benim durumumda gerekli olan ek bir şey, "" Belirtilen kova mevcut değil "" hatasını önlemek için kovanın önceden oluşturulmuş olmasıydı.
    HassanSh__3571619

    @ HassanSh__3571619 Yardımcı olduğuna sevindim.
    Samuel Nde

    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

    Boto3 kullanma

    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

    Daha fazlası için: - https://boto3.amazonaws.com/v1/documentation/api/latest/guide/s3-uploading-files.html


    1

    Aşağıdaki kod ve S3 klasör resmi olarak klasör örneği yüklemek için görüntü açıklamasını buraya girin

    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)

    Not: Daha fazla referans URL için


    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')

    Kodunuzun ne yaptığına dair bir metin açıklaması güzel olacaktır!
    Nick

    0

    Bana biraz daha düzeni varmış gibi görünen bir şeyim var:

    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
    
    

    Burada üç önemli değişken vardır, BUCKET sabiti , file_to_upload ve file_name

    BUCKET: S3 klasörünüzün adıdır

    file_to_upload_path: yüklemek istediğiniz dosyanın yolu olmalıdır

    file_name: paketinizde ortaya çıkan dosya ve yoldur (bu, klasörleri veya ne olursa olsun eklediğiniz yerdir)

    Pek çok yol var, ancak bu kodu bunun gibi başka bir komut dosyasında yeniden kullanabilirsiniz

    import S3
    
    def some_function():
        S3.S3().upload_file(path_to_file, final_file_name)
    Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
    Licensed under cc by-sa 3.0 with attribution required.