【问题标题】:grabbing key and value from nested dict aws response从嵌套的dict aws响应中获取键和值
【发布时间】:2017-01-27 11:18:07
【问题描述】:

我正在努力理解嵌套的字典以及如何从中获取键和值。

我有一个不错的脚本,可以从我的 AWS 账户中获取 VPC 信息:

import boto3
from pprint import pprint

#Declaring some resources for the below scripts. 
ec2 = boto3.resource('ec2')
client = boto3.client('ec2')

#Grabing the VPC information and printing to console. 
filters = [{'Name':'tag:Name', 'Values':['*']}]
vpcs = list(ec2.vpcs.filter(Filters=filters))

for vpc in vpcs:
    response = client.describe_vpcs(
        VpcIds=[
            vpc.id,
        ]
    )
    pprint(response['Vpcs'])
    print('-------')

这样的输出:

[{'CidrBlock': '666.666.0.0/66', 'DhcpOptionsId': '55555', 'InstanceTenancy': 'default', 'IsDefault': False,'State': 'available', '标签':[{'Key':'环境','值':'dev.aws'}, {'Key': 'Name', 'Value': 'dev.aws.co.uk'}], 'VpcId': 'vpc-755555'}]

现在我想要的是只获取 VpcId 和标签,我尝试了 pprint(response['Vpcs']["VpcId"]) 的多种变体。我已经在网上搜索并尝试了许多变体,但我似乎无法理解它

任何人都可以对我的示例提供任何建议吗?

更新: 再次感谢您能协助解答后续问题吗?

我现在正在尝试将其放入 for 循环中,以便我可以获取任何 VPC 的输出和可能存在于 AWS 账户中但遇到“TypeError:字符串索引必须是整数”的结果标签

我尝试过的代码(有很多变体):

  for vpcs in client.describe_vpcs():
    vpcid = vpcs['Vpcs'][0]['VpcId']
    print("Vpc Id:" + vpcid)

    for vpcs in client.describe_vpcs()['Vpcs']:
        print("VPC ID: " + vpcs['VpcId'])
        print(response['Vpcs'][0]['Tags'])
        print("Tags: " + vpcs['Tags'][0])

有什么想法吗?

更新 2:

此循环有效,并将打印出我的 VPC 与第一个 VPC 的标签:

for vpcs in client.describe_vpcs()['Vpcs']:
    print("VPC ID: " + vpcs['VpcId'])
    print(response['Vpcs'][0]['Tags'])

我试图让它循环带有 VPC id 的标签。

print(client.describe_vpcs())的输出:

{'ResponseMetadata': {'RequestId': 'nnnnn-e323-nn-a9a3-254nnnn2c3b6', 'RetryAttempts': 0, 'HTTPHeaders': {'transfer-encoding': 'chunked', 'content-type': 'text/xml;charset=UTF-8', 'vary': 'Accept-Encoding', 'server': 'AmazonEC2', 'date': 'Fri, 27 Jan 2017 14:21:58 GMT'}, 'HTTPStatusCode': 200}, 'Vpcs': [{'State': 'available', 'IsDefault': True, 'CidrBlock': '172.31.0.0/16', 'DhcpOptionsId': 'dopt-1d555578', 'VpcId': 'vpc-85555eb', 'InstanceTenancy': 'default', 'Tags': [{'Value': 'Default VPC', 'Key': 'Name'}]}, {'State': 'available', 'IsDefault': False, 'CidrBlock': '172.22.0.0/16', 'DhcpOptionsId': 'dopt-1d55558', 'VpcId': 'vpc-255554d', 'InstanceTenancy': 'default', 'Tags': [{'Value': 'DEV', 'Key': 'Environment'}, {'Value': 'dev2.aws.co.uk', 'Key': 'Name'}]}, {'State': 'available', 'IsDefault': False, 'CidrBlock': '172.30.0.0/16', 'DhcpOptionsId': 'dopt-16666d78', 'VpcId': 'vpc-7666617', 'InstanceTenancy': 'default', 'Tags': [{'Value': 'dev.aws', 'Key': 'Environment'}, {'Value': 'dev.aws.co.uk', 'Key': 'Name'}]}]}

修复为:

import boto3
client = boto3.client('ec2')

#This is the VPC ID and Linked Tags
for vpctags in client.describe_vpcs()['Vpcs']: 
    print("VPC ID: ", vpctags['VpcId']) 
    print("Tags: ", vpctags['Tags'])

非常感谢 MYGz 抽出时间提供帮助。

【问题讨论】:

  • 你能告诉我for循环中第一个vpcs的输出吗?
  • 回溯(最近一次调用最后):文件“C:\Users\bena\workspacemars\aws.automated.tasks\trying_something_with_vpc_Dicts.py”,第 27 行,在 vpcid = vpcs[' Vpcs'][0]['VpcId'] TypeError: 字符串索引必须是整数
  • 那是第一个循环
  • 第二个循环适用于客户端中的 vpcs.describe_vpcs()['Vpcs']: print("VPC ID: " + vpcs['VpcId']) print(response['Vpcs'] [0]['Tags'])" 但当然它总是打印出相同的标签 lol
  • 更新了我的问题

标签: python amazon-web-services aws-sdk boto3


【解决方案1】:

你需要:

vpcid = response['Vpcs'][0]['VpcId']
        # ^dict    ^key  ^item  ^ key in dictionary
        #                at 0th
        #                position 
        #            (which is a dict)

tags = response['Vpcs'][0]['Tags']

response['Vpcs'] 返回一个列表。此列表仅包含 1 个元素。这 1 个元素是一个字典,其中包含您想要的条目 'VpcId'

字典中键对应的值是通过键来访问的。并且列表中的值是通过索引位置访问的。

例如:

访问'k4'并在下面的字典中获取'v4'的值

a={'k1': [{'k2': [{'k3': 'v3' }, {'k4': 'v4'}] }]}

你必须这样做:

a['k1'][0]['k2'][1]['k4']

【讨论】:

  • 您能协助解答后续问题吗?我现在正在尝试将其放入 for 循环中,以便我可以获取任何 VPC 的输出和可能存在于 AWS 帐户中的结果标签,但遇到“TypeError:字符串索引必须是整数”的代码我试过了: 对于 client.describe_vpcs() 中的 vpc: vpcid = vpcs['Vpcs'][0]['VpcId'] print("Vpc Id:" + vpcid) 对于 client.describe_vpcs()['Vpcs'] 中的 vpc: print("VPC ID:" + vpcs['VpcId']) print(response['Vpcs'][0]['Tags']) print("Tags:" + vpcs['Tags'][0]) 任意想法?
  • @ben 是的,如果它在同一个主题上。
猜你喜欢
  • 2020-07-22
  • 2019-07-08
  • 1970-01-01
  • 2014-04-01
  • 1970-01-01
  • 2019-12-19
  • 2014-06-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多