Boto S3 API不会返回完整的键列表

Ale*_*nko 6 python amazon-s3 boto amazon-web-services

我在我的python脚本中使用boto S3 API,它慢慢地将数据从S3复制到我的本地文件系统.该脚本运行了几天,但现在有一个问题.

我使用以下API函数来获取"目录"中的键列表:

keys = bucket.get_all_keys(prefix=dirname)
Run Code Online (Sandbox Code Playgroud)

而且这个函数(get_all_keys)并不总是返回完整的键列表,我的意思是我可以通过AWS web界面或通过它看到更多的键aws s3 ls s3://path.

在版本2.15和2.30上重现了该问题.

也许boto缓存了我对S3的一些请求(我一遍又一遍地重复相同的请求)?如何解决这个问题,有什么建议吗?

gar*_*aat 13

有一种更简单的方法.该Bucket对象本身可以作为一个迭代器,它知道如何处理分页响应.因此,如果有更多可用结果,它将自动在后台获取它们.所以,这样的事情应该允许你迭代你桶中的所有对象:

for key in bucket:
    # do something with your key
Run Code Online (Sandbox Code Playgroud)

如果要指定前缀并获取以该前缀开头的所有键的列表,您可以这样做:

for key in bucket.list(prefix='foobar'):
    # do something with your key
Run Code Online (Sandbox Code Playgroud)

或者,如果你真的想要建立一个对象列表,那么就这样做:

keys = [k for k in bucket]
Run Code Online (Sandbox Code Playgroud)

但请注意,存储桶可以容纳无限数量的密钥,因此请小心,因为它将构建内存中所有密钥的列表.


Ale*_*nko 5

只是设法让它工作!事实证明,我在S3上的目录中有1013 get_all_keys个密钥,由于AWS API限制,只能返回1000个密钥.

解决方案很简单,只需使用更高级别的功能而无需delimiter参数:

keys = list(bucket.list(prefix=dirname))
Run Code Online (Sandbox Code Playgroud)