如何通过python

时间:2016-03-31 20:16:46

标签: python amazon-s3

使用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的最后一个元素,请为此方案建议解决方案

2 个答案:

答案 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'
)

限制方案条目数的三个有用参数是MarkerMaxKeysPrefix

  

标记 string ) - 指定列出时要开始的键   桶中的物体。
   MaxKeys 整数) - 设置最大数量   响应中返回的键。响应可能包含更少的键   但永远不会包含更多   前缀 string ) - 限制响应   以指定前缀开头的键。

两个注释:

  • 您为标记指定的密钥将包含在结果中,即列表从后面的键开始你指定为Marker的那个。

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

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

    (不幸的是,这在文档中并不明确(它实际上是非常错误的),因为library parameter description是从API parameter description复制的,它实际上是有意义的:" 响应可能包含更少的密钥,但永远不会包含更多密钥。")