【问题标题】:printing responses returned by ec2.describe_regions() in print打印由 ec2.describe_regions() 在 print 中返回的响应
【发布时间】:2018-08-19 14:25:13
【问题描述】:

大家好,我正在学习 python,目前正在为亚马逊 ec2 做一些作业,boto3 连接到实例并通过 python3 启动 t2 微实例,这是一个给出输出的小代码

import boto3

ec2 = boto3.client('ec2')

# Retrieves all regions/endpoints that work with EC2
response = ec2.describe_regions()

print('Regions:', response['Regions'])

代码取自这里https://boto3.readthedocs.io/en/stable/guide/ec2-example-regions-avail-zones.html这是给我以下输出

Regions: 
[
{'Endpoint': 'ec2.ap-south-1.amazonaws.com', 'RegionName': 'ap-south-1'}, 
{'Endpoint': 'ec2.eu-west-3.amazonaws.com', 'RegionName': 'eu-west-3'}, 
{'Endpoint': 'ec2.eu-west-2.amazonaws.com', 'RegionName': 'eu-west-2'}, 
{'Endpoint': 'ec2.eu-west-1.amazonaws.com', 'RegionName': 'eu-west-1'},
{'Endpoint': 'ec2.ap-northeast-2.amazonaws.com', 'RegionName': 'ap-northeast-2'},
{'Endpoint': 'ec2.ap-northeast-1.amazonaws.com', 'RegionName': 'ap-northeast-1'}, 
{'Endpoint': 'ec2.sa-east-1.amazonaws.com', 'RegionName': 'sa-east-1'}, 
{'Endpoint': 'ec2.ca-central-1.amazonaws.com', 'RegionName': 'ca-central-1'},
{'Endpoint': 'ec2.ap-southeast-1.amazonaws.com', 'RegionName': 'ap-southeast-1'},
{'Endpoint': 'ec2.ap-southeast-2.amazonaws.com', 'RegionName': 'ap-southeast-2'}, 
{'Endpoint': 'ec2.eu-central-1.amazonaws.com', 'RegionName': 'eu-central-1'}, 
{'Endpoint': 'ec2.us-east-1.amazonaws.com', 'RegionName': 'us-east-1'}, 
{'Endpoint': 'ec2.us-east-2.amazonaws.com', 'RegionName': 'us-east-2'},
{'Endpoint': 'ec2.us-west-1.amazonaws.com', 'RegionName': 'us-west-1'}, 
{'Endpoint': 'ec2.us-west-2.amazonaws.com', 'RegionName': 'us-west-2'}
]

我想要做的是一一打印函数 ec2.describe_regions() 返回的字典中的值。

print (response[0],response[1],response[2])  

但这给了我密钥错误

describe_regions2.py", line 9, in <module>
    print (response[0])
KeyError: 0

如果我做一个

print (response['Endpoint'])

然后我也得到错误

describe_regions2.py", line 9, in <module>
    print (response['Endpoint'])
KeyError: 'Endpoint'
>>> 

如何获取 ec2.describe_regions() 的单个元素我在这里阅读了文档 https://boto3.readthedocs.io/en/latest/reference/services/ec2.html#EC2.Client.describe_regions 当使用print(response) 时,它给出了预期的输出。
在这里,我只想要从字典返回的一些所需元素,而不是所有输出。这是我无法在代码中获得的。 如果我使用

print (response['Regions'][0]['Endpoint'])

我明白了

ec2.ap-south-1.amazonaws.com

如果我使用

print (response['Regions'][0])

我收到{'Endpoint': 'ec2.ap-south-1.amazonaws.com', 'RegionName': 'ap-south-1'}

我尝试的新代码是

import boto3

ec2 = boto3.client('ec2')

# Retrieves all regions/endpoints that work with EC2
response = ec2.describe_regions()
c=0
#print('Regions:', response['Regions'])
#for i in response:
#    print ("i= ",i+" response[i]=",response[i])
#    print ("\n")
print ("\nhale luliya\n")
print ("Endpoint="+response['Regions'][0]['Endpoint'])
print ("RegionName="+response['Regions'][0]['RegionName'])
print ("Full response for list[0]"+response['Regions'][0])

最后一个打印语句出错

\describe_regions2.py", line 15, in <module>
    print ("Full response for list[0]"+response['Regions'][0])
TypeError: can only concatenate str (not "dict") to str

如何遍历在 for 循环中收到的整个列表作为响应。仅打印所需的值? 我能做到

for key,value in response['Regions'][0].items():
    print(key,value)

这给了我

Endpoint ec2.ap-south-1.amazonaws.com
RegionName ap-south-1

问题已解决,更新到这里 这里的复杂性是因为print(type(response['Regions'])) 给出了 &lt;class 'list'&gt;print(type(response['Regions']))&lt;class 'dict'&gt;

print (type(response))

&lt;class 'dict'&gt;,所以字典也被返回到字典中,一个列表,另一个字典被返回。所以我无法理解。

的输出
for data in response['Regions']: 
    print(data) 
for key,value in response['ResponseMetadata'].items(): 
    print(key,value)

帮助我了解返回的内容

{'Endpoint': 'ec2.ap-south-1.amazonaws.com', 'RegionName': 'ap-south-1'}
{'Endpoint': 'ec2.eu-west-3.amazonaws.com', 'RegionName': 'eu-west-3'}
{'Endpoint': 'ec2.eu-west-2.amazonaws.com', 'RegionName': 'eu-west-2'}
{'Endpoint': 'ec2.eu-west-1.amazonaws.com', 'RegionName': 'eu-west-1'}
{'Endpoint': 'ec2.ap-northeast-2.amazonaws.com', 'RegionName': 'ap-northeast-2'}
{'Endpoint': 'ec2.ap-northeast-1.amazonaws.com', 'RegionName': 'ap-northeast-1'}
{'Endpoint': 'ec2.sa-east-1.amazonaws.com', 'RegionName': 'sa-east-1'}
{'Endpoint': 'ec2.ca-central-1.amazonaws.com', 'RegionName': 'ca-central-1'}
{'Endpoint': 'ec2.ap-southeast-1.amazonaws.com', 'RegionName': 'ap-southeast-1'}
{'Endpoint': 'ec2.ap-southeast-2.amazonaws.com', 'RegionName': 'ap-southeast-2'}
{'Endpoint': 'ec2.eu-central-1.amazonaws.com', 'RegionName': 'eu-central-1'}
{'Endpoint': 'ec2.us-east-1.amazonaws.com', 'RegionName': 'us-east-1'}
{'Endpoint': 'ec2.us-east-2.amazonaws.com', 'RegionName': 'us-east-2'}
{'Endpoint': 'ec2.us-west-1.amazonaws.com', 'RegionName': 'us-west-1'}
{'Endpoint': 'ec2.us-west-2.amazonaws.com', 'RegionName': 'us-west-2'}
RequestId 221d8d0f-908f-4996-8c88-87b00c5da592
HTTPStatusCode 200
HTTPHeaders {'content-type': 'text/xml;charset=UTF-8', 'content-length': '2559', 'vary': 'Accept-Encoding', 'date': 'Sun, 19 Aug 2018 06:20:40 GMT', 'server': 'AmazonEC2'}
RetryAttempts 0

【问题讨论】:

    标签: python python-3.x amazon-web-services amazon-ec2 boto3


    【解决方案1】:

    您可以使用这些简单的步骤来调试您遇到的问题。

    每当您收到回复时,请发送print(type(response))

    • 如果输出为str,则表示需要使用python自带的json库转换成json
    • 如果你得到输出list,那么你可以通过像response[0], response[1]这样的索引来访问它,或者循环访问它
    • 如果你得到输出dict,那么你可以通过像response['Endpoint']这样的名字来访问它

    一般在处理api数据时,需要按照以上步骤进行。您可能会得到嵌套级别的结果,如 字典列表列表,或 字典列表字典,或者可以转换为 json 的纯字符串。

    更新: 您可以按如下方式迭代字典:

    data = {'Endpoint': 'ec2.ap-south-1.amazonaws.com', 'RegionName': 'ap-south-1'}
    for key,value in data.items():
        print(key , value)
    

    【讨论】:

    • 在尝试的时候我做了一个打印 (response['Regions'][0]['Endpoint']) 给了我一些帮助来找到我正在寻找的值我更新了问题。
    • 我在for key,value in response['Regions'][0].items(): print(key,value) 之后写了它,它为Endpoint=ec2.ap-south-1.amazonaws.com RegionName=ap-south-1 Endpoint ec2.ap-south-1.amazonaws.com RegionName ap-south-1 提供了输出现在我如何遍历其个人成员为 dict 的整个列表
    • 没有。 response['Regions'] 是一个列表,所以当你遍历一个列表时,不要写 for key,value in response['Regions']: print(key,value) 而是写 for data in response['Regions']: print(data)。请按照三个步骤使用print(type(response['Regions']))查找数据类型,这将帮助您更好
    • 是的,我知道了for data in response['Regions']: print(data) for key,value in response['ResponseMetadata'].items(): print(key,value)
    • 这里的复杂性是因为print(type(response['Regions'])) 给出了`&lt;class 'list'&gt;print(type(response['Regions']))&lt;class 'dict'&gt;print (type(response))&lt;class 'dict'&gt; 所以字典也在字典中返回一个列表和另一个字典被退回。所以我无法理解。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多