【发布时间】:2012-10-24 23:36:42
【问题描述】:
我喜欢编写一个 boto python 脚本来从 s3 存储桶下载最新的文件,例如,我在 s3 存储桶中有 100 个文件,我需要在其中下载最近上传的文件。
有没有办法使用 python boto 从 S3 下载最近修改过的文件。
【问题讨论】:
我喜欢编写一个 boto python 脚本来从 s3 存储桶下载最新的文件,例如,我在 s3 存储桶中有 100 个文件,我需要在其中下载最近上传的文件。
有没有办法使用 python boto 从 S3 下载最近修改过的文件。
【问题讨论】:
您可以列出存储桶中的所有文件并找到最新的文件(使用 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')
但是请注意,如果存储桶中有很多文件,这将非常低效。在这种情况下,您可能需要考虑使用数据库来跟踪文件和日期,以提高查询效率。
【讨论】:
要添加到@garnaat 的答案,您可以通过使用prefix 减少匹配文件来解决效率低下的问题。此示例不会搜索c.lookup,而是仅搜索subdir 子存储桶中以file_2014_ 开头的文件:
>>> 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')
【讨论】:
S3 启动了桶 http://docs.aws.amazon.com/AmazonS3/latest/dev/Versioning.html 中文件的版本控制功能。
您可以通过调用 s3client.listVersions(request) 并根据需要指定 n 来获取最新的 n 个文件。参见 http://docs.aws.amazon.com/AmazonS3/latest/dev/list-obj-version-enabled-bucket.html
示例在 java 中。不确定 boto 是否添加了用于版本控制的 API。
【讨论】: