当前位置: 首页 > 知识库问答 >
问题:

如何使用Boto3分页

尉迟跃
2023-03-14

背景:

默认情况下,列出IAM用户的AWS操作返回的最大值为50。

阅读下面的文档(链接),我运行下面的代码,并通过将“MaxItems”设置为1000返回完整的数据集。

paginator = client.get_paginator('list_users')
response_iterator = paginator.paginate(
 PaginationConfig={
     'MaxItems': 1000,
     'PageSize': 123})
for page in response_iterator:
    u = page['Users']
    for user in u:
        print(user['UserName'])

http://boto3.readthedocs.io/en/latest/guide/paginators.html https://boto3.readthedocs.io/en/latest/reference/services/iam.html#IAM.Paginator.ListUsers

问题:

例如,如果“MaxItems”设置为10,那么循环遍历结果的最佳方法是什么?这个

测试了以下内容,但它只循环2次迭代之前的'IsTruncated'==False和结果的关键错误:'标记'。不知道为什么会这样,因为我知道有200多个结果。

marker = None

while True:
    paginator = client.get_paginator('list_users')
    response_iterator = paginator.paginate( 
        PaginationConfig={
            'MaxItems': 10,
            'StartingToken': marker})
    #print(response_iterator)
    for page in response_iterator:
        u = page['Users']
        for user in u:
            print(user['UserName'])
            print(page['IsTruncated'])
            marker = page['Marker']
            print(marker)
        else:
            break

共有1个答案

欧阳向文
2023-03-14

(回答重写)**注意**,分页器包含一个与留档不一致的错误(反之亦然)。MaxItem当总项目超过MaxItem数量时不返回标记或NextToken。事实上Pagesize控制标记/NextToken指示符返回的一个。

import sys
import boto3
iam = boto3.client("iam")
marker = None
while True:
    paginator = iam.get_paginator('list_users')
    response_iterator = paginator.paginate( 
        PaginationConfig={
            'PageSize': 10,
            'StartingToken': marker})
    for page in response_iterator:
        print("Next Page : {} ".format(page['IsTruncated']))
        u = page['Users']
        for user in u:
            print(user['UserName'])
    try:
        marker = response_iterator['Marker']
        print(marker)
    except KeyError:
        sys.exit()

代码不工作不是你的错 MaxItems似乎成为一个“阈值”指示器。具有讽刺意味的是,原始boto3.iam.list_用户中的 MaxItems,仍然可以像前面提到的那样工作。

如果选中boto3.iam.list_users,您会注意到您忽略了标记,否则必须输入一个值。显然,paginator并不是所有boto3类列表方法的包装器。

import sys
import boto3
iam = boto3.client("iam")
marker = None
while True:
    if marker:
        response_iterator = iam.list_users(
            MaxItems=10,
            Marker=marker
        )
    else:
        response_iterator = iam.list_users(
            MaxItems=10
        )
    print("Next Page : {} ".format(response_iterator['IsTruncated']))
    for user in response_iterator['Users']:
        print(user['UserName'])

    try:
        marker = response_iterator['Marker']
        print(marker)
    except KeyError:
        sys.exit()

您可以跟进我在boto3 github中提交的问题。根据成员,您可以在paginate()之后调用build\u full\u result,这将显示所需的行为。

 类似资料:
  • 我们正在使用boto3为我们的DynamoDB,我们需要做一个完整的扫描我们的表,以便能够做到这一点,基于其他帖子,我们需要做一个分页。但是,我们无法找到分页的工作示例。这是我们所做的。 我们不知道如何将esk作为下一个查询的ExclusiveStartKey。ExclusiveStartkey参数的预期值应该是多少?我们在DynamoDB还是新手,还有很多东西需要学习,包括这个。谢谢

  • 我将大的zip文件存储在s3存储桶中,因此我想使用python boto3库分块下载它们。 我首先尝试使用方法,但无法仅获取对象的一部分,因此我现在使用方法,该方法支持参数。 然而,在我开始得到零件之前,我无法找到零件的数量。我的意思是,如果我在没有给出零件号的情况下调用get,我会得到以下响应: {'ETag':'493458a23b7d2ed524e8f144aa9e91f4-27','Las

  • 我上传到S3使用以下代码: 我无法了解boto内部如何处理分段上传的任何信息。我对同样的事情有几个问题,让我们假设我有2.5 MB的文件: 然后文件将分3部分上传,如1,1和.5 MB? 所有3个部分将并行上传还是按顺序上传? 在java的aws库中,我们有转移管理器,在博托中有什么类似的东西吗? 此代码是否足以用于多段上传?因为我遇到了一些复杂的代码示例 任何帮助都将不胜感激。

  • 问题内容: 我试图弄清楚如何使用boto3进行正确的错误处理。 我正在尝试创建一个IAM用户: 成功调用create_user后,我得到一个整洁的对象,其中包含API调用的http状态代码和新创建的用户的数据。 例: 这很好。但是,如果失败(例如用户已经存在),我只会得到一个类型为botocore.exceptions.ClientError的对象,其中只有文本可以告诉我出了什么问题。 示例:Cl

  • 问题内容: 我正在尝试使用适用于AWS的新boto3客户端做一个“ hello world” 。 我的用例非常简单:从S3获取对象并将其保存到文件中。 在boto 2.XI中,它应该是这样的: 在boto 3中。我找不到一种干净的方法来做同样的事情,所以我手动遍历了“ Streaming”对象: 要么 而且效果很好。我想知道是否有任何“本机” boto3函数可以完成相同的任务? 问题答案: Bot

  • 我在s3桶中保存了一些json文件,我想使用boto3读取这些json文件的内容。有人能建议怎么做吗?