2012-11-05 28 views
6

Tôi thích viết một tập lệnh python boto để tải xuống tệp gần đây nhất từ ​​nhóm s3, ví dụ: tôi có 100 tệp trong nhóm s3 Tôi cần tải xuống tệp được tải lên gần đây nhất trong đó.Boto script để tải xuống tệp mới nhất từ ​​s3 bucket

Có cách nào để tải xuống tệp được sửa đổi gần đây nhất từ ​​S3 bằng boto python hay không.

Trả lời

12

Bạn có thể liệt kê tất cả các tệp trong nhóm và tìm tệp có tệp gần đây nhất (sử dụng thuộc tính last_modified).

>>> import boto 
>>> c = boto.connect_s3() 
>>> bucket = c.lookup('mybucketname') 
>>> l = [(k.last_modified, k) for k in bucket] 
>>> key_to_download = sorted(l, cmp=lambda x,y: cmp(x[0], y[0]))[-1][1] 
>>> key_to_download.get_contents_to_filename('myfile') 

Lưu ý, tuy nhiên, điều này sẽ không hiệu quả khi bạn có nhiều tệp trong thùng. Trong trường hợp đó, bạn có thể muốn xem xét sử dụng một cơ sở dữ liệu để theo dõi các tập tin và ngày tháng để làm cho truy vấn hiệu quả hơn.

+0

Cảm ơn tôi đã hiểu đúng – user1386776

7

Để thêm vào câu trả lời của @ garnaat, bạn có thể giải quyết sự thiếu hiệu quả bằng cách sử dụng prefix để giảm các tệp phù hợp.

>>> import boto 
>>> c = boto.connect_s3() 
>>> bucket = c.get_bucket('mybucketname') 
>>> bucket_files = bucket.list('subdir/file_2014_') 
>>> l = [(k.last_modified, k) for k in bucket_files] 
>>> key_to_download = sorted(l, cmp=lambda x,y: cmp(x[0], y[0]))[-1][1] 
>>> key_to_download.get_contents_to_filename('target_filename') 
3

S3 ra mắt versioning chức năng của tập tin trong xô http://docs.aws.amazon.com/AmazonS3/latest/dev/Versioning.html: Thay vì c.lookup, ví dụ này sẽ chỉ tập tin trong subdir subbucket bắt đầu bằng file_2014_ tìm kiếm.

Bạn có thể nhận các file n mới nhất bằng cách gọi s3client.listVersions (theo yêu cầu) và xác định n nếu bạn want.See http://docs.aws.amazon.com/AmazonS3/latest/dev/list-obj-version-enabled-bucket.html

Ví dụ là trong java. Không chắc chắn nếu boto thêm API cho phiên bản.

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