2013-02-26 32 views
55

Tôi muốn sao chép tệp trong xô s3 bằng python.Cách tải tệp lên thư mục trong thùng S3 bằng boto

Ví dụ: Tôi có tên nhóm = thử nghiệm. Và trong thùng, tôi có 2 tên thư mục "dump" & "đầu vào". Bây giờ tôi muốn sao chép một tập tin từ thư mục địa phương để S3 "dump" thư mục bằng cách sử dụng python ... Bất cứ ai có thể giúp tôi?

Trả lời

72

Hãy thử này ...

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) 

[UPDATE] Tôi không phải là một pythonist, do đó, nhờ người đứng đầu lên về những điều khoản về nhập khẩu. Ngoài ra, tôi không khuyên bạn nên đặt thông tin đăng nhập bên trong mã nguồn của riêng bạn. Nếu bạn đang chạy này bên trong AWS sử dụng Credentials IAM với Instance Profiles (http://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2_instance-profiles.html), và để giữ cho các hành vi tương tự trong môi trường Dev/thử nghiệm của bạn, sử dụng giống như Hologram từ AdRoll (https://github.com/AdRoll/hologram)

+6

tôi sẽ tránh các dòng nhập khẩu nhiều, không pythonic. Di chuyển các dòng nhập vào đầu trang và đối với boto, bạn có thể sử dụng S3Connection nhập boto.s3.connection; conn = S3Connection (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY); bucket = conn.create_bucket (tên nhóm ...); bucket.new_key (keyname, ...). set_contents_from_filename .... – cgseller

28

tôi đã sử dụng này và nó là rất đơn giản để thực hiện

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/

+0

Tôi không nghĩ rằng điều này làm việc cho các tập tin lớn. Tôi đã phải sử dụng điều này: http://docs.pythonboto.org/en/latest/s3_tut.html#storing-large-data – wordsforthewise

+0

Điều đó cũng khiến tôi khắc phục sự cố này: https://github.com/boto/boto/ vấn đề/2207 # issuecomment-60682869 và điều này: http://stackoverflow.com/questions/5396932/why-are-no-amazon-s3-authentication-handlers-ready – wordsforthewise

+0

Vì dự án tinys3 bị hủy, bạn không nên sử dụng . https://github.com/smore-inc/tinys3/issues/45 –

27

Không cần phải làm cho nó phức tạp mà:

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) 
+0

Điều này sẽ hiệu quả, nhưng đối với các tệp .zip lớn, bạn có thể cần phải sử dụng chunked. http://www.elastician.com/2010/12/s3-multipart-upload-in-boto.html – cgseller

+1

Có .. ít phức tạp và thường được sử dụng thực hành –

+1

Tôi đã thử này, nó không hoạt động, nhưng k.set_contents_from_filename (testfile, cb = percent_cb, num_cb = 10) không – Simon

5
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) 
+0

filepath là gì và tên tập tin directory_name + là gì?nó gây nhầm lẫn – colintobing

+0

@colintobing filepath là đường dẫn tệp trên cụm và folder_name/tên tệp là quy ước đặt tên mà bạn muốn có bên trong s3 bucket –

+1

wow, tại sao có 50 cách để làm điều này ... –

7

này cũng sẽ làm việc:

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" 
2
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) 
0
import boto3 

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

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

bạn có thể giải thích dòng này s3.Bucket (BUCKET) .upload_file ("your/local/file", "dump/file ") – venkat

+0

@venkat" của bạn/local/file "là một filepath như" /home/file.txt "trên máy tính bằng cách sử dụng python/boto và" dump/file "là một tên khóa để lưu trữ các tập tin theo trong Thùng S3. Xem: http://boto3.readthedocs.io/en/latest/reference/services/s3.html#S3.Bucket.upload_file –

Các vấn đề liên quan