繁体   English   中英

如何通过python只获取在S3位置创建/修改的最新文件/文件

[英]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' ) 

限制场景条目数的三个有用参数是MarkerMaxKeysPrefix

标记字符串 ) - 指定在存储桶中列出对象时要开始的键。
MaxKeys整数 ) - 设置响应中返回的最大键数。 响应可能包含较少的键,但永远不会包含更多键。
Prefixstring ) - 限制对以指定前缀开头的键的响应。

两个笔记:

  • 您指定标记的密钥将被包括在结果,即从上市下列指定为标记的一个关键开始。

  • boto3库正在对结果执行自动分页 每个页面的大小由过滤器函数的MaxKeys参数确定(默认为1000)。

    如果迭代s3.Bucket.objectsCollection对象超过它,它将自动下载下一页。 虽然这通常很有用,但是当你指定例如MaxKeys=10并且只想迭代10个键时,它可能会令人惊讶,但是迭代器将遍历所有匹配的键,只需要为每个10个键提供服务器的新请求。
    所以, 如果你只想要例如前三个结果,手动中断循环,不要依赖迭代器

    (不幸的是,这在文档中并不清楚(实际上是非常错误的),因为库参数描述是从API参数描述复制的,实际上它有意义:“ 响应可能包含更少的键,但永远不会包含更多。 ”)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM