最新消息:因从typecho切换到wordpress, 由于转换导入问题,文章可能存在部分乱码或者排版问题,逐个排查修复中...

翻译翻译:BOTO3 的分页

写写代码 admin 1635浏览 0评论

最近使用BOTO3获取AWS S3文件时,遇到了一个问题,发现获取的文件列表中老是缺失某个“文件夹”(AWS S3中叫Prefix)后来仔细查了下发现是Boto3每次request有个返回至多1000个objects的限制。有限制怎么办?再仔细看了下,其实它是支持分页的。如何使用分页?可以直接查阅API说明,比如https://boto3.readthedocs.io/en/latest/reference/services/s3.html#S3.Paginator.ListObjectsV2
不过鄙人在网上找了一篇英文文章,直接提供了个Example Code,这样省事多了。

原文见:https://sixfeetup.com/blog/automation-with-boto3-library

以下是根据原文意思,本人粗略翻译的内容:

大部分的Boto3的调用产生的大量结果是支持分页的。

比如,当进行枚举S3 Bucket中的Objects时,Boto3 将返回至多1000个结果,并且会提供一个reference key. 在下一次请求时,该reference key将会被发送并且Boto3将会记住什么被发送了,然后会返回下一页结果以及另外一个新的reference key, 依次类推。

这将提高单个AWS调用的性能。但也将导致总体下会发生多次调用,取决于你要查找的目标。你将面临各种限制如果你不仔细处理你的请求的话。

下面是一个利用reference key进行获取下一页结果的示例

import boto3

s3client = boto3.client('s3')
results = s3client.list_objects_v2(Bucket='my-bucket')
if results['IsTruncated']:
    # there are more results
    cont = results['ContinuationToken']
    more_results = s3client.list_objects_v2(
        Bucket='my-bucket',
        ContinuationToken=cont,
   )

当然该例子只是获取了前面2页的结果,而且某种意义上来说是手工处理。Boto3 其实提供分页器,它可以使事情变得简单:

import boto3

s3client = boto3.client('s3')
paginator = s3client.get_paginator('list_objects_v2')
page_iterator = paginator.paginate(Bucket='my-bucket')
for page in page_iterator:
    stuff = page['Contents']

翻译内容结束。

转载请注明:Linc Hu » 翻译翻译:BOTO3 的分页

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址