![](/img/trans.png)
[英]How to get last modified date of latest file from S3 with Boto Python?
[英]How can I get only the latest file/files created/modified on S3 location through python
使用boto我尝试了以下代码:
from boto.s3.connection import S3Connection
conn = S3Connection('XXX', 'YYYY')
bucket = conn.get_bucket('myBucket')
file_list = bucket.list('just/a/prefix/')
但我无法获取列表的长度或file_list的最后一个元素,因为它是BucketListResultSet类型,请为此方案建议一个解决方案
您正在尝试使用boto
库,该库已过时且未得到维护。 该库的问题数量正在增加。
更好地使用目前开发的boto3
。
首先,让我们定义搜索参数:
>>> bucket_name = "bucket_of_m"
>>> prefix = "region/cz/"
导入boto3
并创建代表S3资源的s3:
>>> import boto3
>>> s3 = boto3.resource("s3")
获取桶:
>>> bucket = s3.Bucket(name=bucket_name)
>>> bucket
s3.Bucket(name='bucket_of_m')
为具有给定前缀的对象定义过滤器:
>>> res = bucket.objects.filter(Prefix=prefix)
>>> res
s3.Bucket.objectsCollection(s3.Bucket(name='bucket_of_m'), s3.ObjectSummary)
并迭代它:
>>> for obj in res:
... print obj.key
... print obj.size
... print obj.last_modified
...
每个obj
都是ObjectSummary(而不是Object本身),但它仍然需要了解它
>>> obj
s3.ObjectSummary(bucket_name='bucket_of_m', key=u'region/cz/Ostrava/Nadrazni.txt')
>>> type(obj)
boto3.resources.factory.s3.ObjectSummary
您可以从中获取Object并根据需要使用它:
>>> o = obj.Object()
>>> o
s3.Object(bucket_name='bucket_of_m', key=u'region/cz/rodos/fusion/AdvancedDataFusion.xml')
过滤的选项并不多,但前缀可用。
作为Jan答案的附录:
似乎boto3库在此期间发生了变化,目前(编写本文时为1.6.19版) 为filter
方法提供了更多参数 :
object_summary_iterator = bucket.objects.filter( Delimiter='string', EncodingType='url', Marker='string', MaxKeys=123, Prefix='string', RequestPayer='requester' )
限制场景条目数的三个有用参数是Marker
, MaxKeys
和Prefix
:
标记 ( 字符串 ) - 指定在存储桶中列出对象时要开始的键。
MaxKeys ( 整数 ) - 设置响应中返回的最大键数。 响应可能包含较少的键,但永远不会包含更多键。
Prefix ( string ) - 限制对以指定前缀开头的键的响应。
两个笔记:
您指定标记的密钥将不被包括在结果,即从上市下列指定为标记的一个关键开始。
boto3库正在对结果执行自动分页 。 每个页面的大小由过滤器函数的MaxKeys参数确定(默认为1000)。
如果迭代s3.Bucket.objectsCollection
对象超过它,它将自动下载下一页。 虽然这通常很有用,但是当你指定例如MaxKeys=10
并且只想迭代10个键时,它可能会令人惊讶,但是迭代器将遍历所有匹配的键,只需要为每个10个键提供服务器的新请求。
所以, 如果你只想要例如前三个结果,手动中断循环,不要依赖迭代器 。
(不幸的是,这在文档中并不清楚(实际上是非常错误的),因为库参数描述是从API参数描述复制的,实际上它有意义:“ 响应可能包含更少的键,但永远不会包含更多。 ”)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.