处理python字典中的缺失键

时间:2019-03-07 17:27:57

标签: python boto

我正在构建Amazon中的EC2实例列表。我正在测试字典中是否存在称为PrivateIpAddress和PublicIpAddress的键。在某些情况下,这两个键都不存在,并且出现异常:

-------------------------------------
Instance ID: i-86533615
Type: m4.xlarge
State: stopped
Private IP: 10.1.233.18
Traceback (most recent call last):
  File ".\aws_ec2_list_instances.py", line 43, in <module>
    print(Fore.CYAN + "{0}: {1}".format(key, instance[key]))
KeyError: 'Public IP'

我的代码说:

for instance in reservation["Instances"]:
if 'PrivateIpAddress' in instance and 'PublicIpAddress' in instance:
    ... do stuff...
elif 'PrivateIpAddress' in instance:
else:
    ...do stuff..

但是最后一个没有解决实例既没有公共IP地址又没有私有IP地址的问题。

这是python中的完整代码:list ec2 instances

2 个答案:

答案 0 :(得分:1)

for instance in reservation.get("Instances", []):
    private_ip_address = instance.get("PrivateIpAddress" , None)
    public_ip_address = instance.get("PublicIpAddress" , None)
    if  private_ip_address and public_ip_address:
    ... do stuff...
    elif private_ip_address:
       ...do stuff.. 
    else:
       ...do stuff..

尝试这个

答案 1 :(得分:1)

我认为您的逻辑存在一个基本问题。您正在遍历所有实例,并在 ec2info 中为每个实例建立地图。但是,每次循环时,在处理特定实例时,您都会循环遍历 ec2info 中的所有数据,包括循环的先前迭代添加的数据。我敢打赌,您真的不想这样做。我敢打赌,您真的想只显示您正在处理的实例的属性。

这是解决您问题的关键:

attributes = ['Instance ID', 'Type',
    'State', 'Private IP', 'Launch Time' ]
for instance_id, instance in ec2info.items():

因此,在这里,您要遍历 ec2info 中的所有地图,但是您要应用一组特定于您当前正在处理的实例的“属性”。由于通常来说,按照您自己的代码, ec2info 中的并非所有地图都具有全部相同的键,因此您会遇到错误。