2015-05-11 22 views

Trả lời

14

Tôi nghĩ tài liệu boto S3 sẽ trả lời câu hỏi của bạn.

https://github.com/boto/boto/blob/develop/docs/source/s3_tut.rst

Di chuyển tập tin từ một xô khác thông qua boto là một cách hiệu quả một bản sao của các phím từ nguồn tới đích hơn loại bỏ phím từ nguồn.

Bạn có thể nhận được quyền truy cập vào các xô:

import boto 

c = boto.connect_s3() 
src = c.get_bucket('my_source_bucket') 
dst = c.get_bucket('my_destination_bucket') 

và lặp các phím:

for k in src.list(): 
    # copy stuff to your destination here 
    dst.copy_key(k.key.name, src, k.key.name) 
    # then delete the source key 
    k.delete() 

Xem thêm: Is it possible to copy all files from one S3 bucket to another with s3cmd?

+0

Câu hỏi của tôi là cách sao chép các tệp ...? – Gal

+2

Đây có thể là cách tốt nhất để làm điều đó. Hãy ghi nhớ nếu bạn có phiên bản trên đó sẽ có bóng còn sót lại trong thùng ban đầu. Ngoài ra, bạn có thể muốn sao chép bản sao của bạn trên một thử: mong đợi để bạn không xóa trước khi bạn có một bản sao. Bạn cũng có thể sao chép và theo dõi các bản sao và sau đó đi qua các xô dst và làm một key.lookup() và chắc chắn rằng nó là có, và nếu như vậy sau đó và chỉ sau đó làm một orig.delete(). – cgseller

+0

Gal: phím là đối tượng và đối tượng chứa nội dung. Bằng cách di chuyển khóa, bạn đang di chuyển 'tệp' một cách hiệu quả. Hãy suy nghĩ về nó như di chuyển con trỏ tập tin trong hệ thống tập tin khi bạn sao chép một tập tin trên máy tính của bạn, dưới mui xe nó là phương pháp tương tự. Cú pháp – cgseller

2

tên Bucket phải là chuỗi không đối tượng xô. Dưới sự thay đổi làm việc cho tôi

for k in src.list(): 
    dst.copy_key(k.key, src.name, k.key) 
2

awscli hiện công việc 30 lần nhanh hơn cho tôi hơn boto đối phó và xóa mỗi phím. Có lẽ do đa luồng trong awscli. Nếu bạn vẫn muốn chạy nó từ kịch bản python của bạn mà không gọi các lệnh shell từ nó, bạn có thể thử một cái gì đó như thế này:

Install awscli gói python:

sudo pip install awscli 

Và sau đó nó cũng đơn giản như thế này:

import os 
if os.environ.get('LC_CTYPE', '') == 'UTF-8': 
    os.environ['LC_CTYPE'] = 'en_US.UTF-8' 

from awscli.clidriver import create_clidriver 
driver = create_clidriver() 
driver.main('s3 mv source_bucket target_bucket --recursive'.split()) 
+0

Làm thế nào tôi có thể cung cấp cấu hình ở đây mà không cần đặt chúng trong các biến môi trường của tôi –

+0

Không biết một cách dễ dàng. Tôi sẽ thiết lập các biến env từ python trước khi chạy trình điều khiển. –

+0

Không phải là awscli dựa trên boto mặc dù? – gtd

3

Nếu bạn đang sử dụng boto3 (phiên bản boto mới hơn) này là khá đơn giản

import boto3 
s3 = boto3.resource('s3') 
copy_source = { 
    'Bucket': 'mybucket', 
    'Key': 'mykey' 
} 
s3.meta.client.copy(copy_source, 'otherbucket', 'otherkey') 

(Docs)

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