使用boto我尝试了以下代码:
from boto.s3.connection import S3Connection
conn = S3Connection('XXX', 'YYYY')
bucket = conn.get_bucket('myBucket')
file_list = bucket.list('just/a/prefix/')
但由于它是BucketListResultSet类型,因此无法获取列表的长度或file_list的最后一个元素,请为此方案建议解决方案
答案 0 :(得分:5)
您正在尝试使用repository: "https://github.com/ptgoetz/storm-signals.git"
库,该库已过时且未得到维护。的数量
这个库的问题正在增长。
更好地使用当前开发的boto
。
首先,让我们定义搜索参数:
boto3
导入>>> bucket_name = "bucket_of_m"
>>> prefix = "region/cz/"
并创建代表S3资源的s3:
boto3
获取存储桶:
>>> 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
...
都是ObjectSummary(不是对象本身),但它仍然需要了解它的内容
obj
您可以从中获取对象并根据需要使用它:
>>> obj
s3.ObjectSummary(bucket_name='bucket_of_m', key=u'region/cz/Ostrava/Nadrazni.txt')
>>> type(obj)
boto3.resources.factory.s3.ObjectSummary
没有太多的过滤选项,但前缀可用。
答案 1 :(得分:1)
作为Jan's answer的附录:
似乎boto3库在此期间发生了变化,目前(撰写本文时版本为1.6.19)提供了more parameters for the filter
method:
object_summary_iterator = bucket.objects.filter( Delimiter='string', EncodingType='url', Marker='string', MaxKeys=123, Prefix='string', RequestPayer='requester' )
限制方案条目数的三个有用参数是Marker
,MaxKeys
和Prefix
:
标记( string ) - 指定列出时要开始的键 桶中的物体。
MaxKeys (整数) - 设置最大数量 响应中返回的键。响应可能包含更少的键 但永远不会包含更多 前缀( string ) - 限制响应 以指定前缀开头的键。
两个注释:
您为标记指定的密钥将不包含在结果中,即列表从后面的键开始你指定为Marker的那个。
boto3库正在对结果执行自动分页。每个页面的大小由过滤器函数的 MaxKeys 参数决定(默认为1000)。
如果您对s3.Bucket.objectsCollection
对象进行迭代以进行更多操作,它将自动下载下一页。虽然这通常很有用,但是当您指定例如,这可能会令人惊讶。 MaxKeys=10
并且只想迭代10个密钥,但迭代器将遍历所有匹配的密钥,只需要为每个10个密钥服务一个新请求。
所以,如果你只是想要,例如前三个结果,手动中断循环,不依赖于迭代器。
(不幸的是,这在文档中并不明确(它实际上是非常错误的),因为library parameter description是从API parameter description复制的,它实际上是有意义的:" 响应可能包含更少的密钥,但永远不会包含更多密钥。")