【发布时间】:2019-03-19 15:55:47
【问题描述】:
我有这个来自 arista 开关的嵌套字典输出,并且想要迭代这个 json 列表/字典以提取每个接口的以下信息。
Interfacename(like Ethernet29/1) 和 actorPortPriority(32768)
如何访问这些数据?
我尝试过:
for k, v in data.items():
print(v['interfaces'])
print(v['interfaces']['actorPortPriority']
但我没听懂。
据我了解,我有一个嵌套的字典,但实际上并没有得到它
遍历嵌套的dicts。
data 的示例:
{'interfaces': {'Ethernet29/1': {'actorOperKey': '0x00c8',
'actorPortId': 117,
'actorPortPriority': 32768,
'actorPortState': {'activity': True,
'aggregation': True,
'collecting': True,
'defaulted': False,
'distributing': True,
'expired': False,
'synchronization': True,
'timeout': False},
'actorPortStatus': 'bundled',
'partnerOperKey': '0x82af',
'partnerPortId': 16643,
'partnerPortPriority': 32768,
'partnerPortState': {'activity': True,
'aggregation': True,
'collecting': True,
'defaulted': False,
'distributing': True,
'expired': False,
'synchronization': True,
'timeout': False},
'partnerSysId': '7F9B,00-23-04-ee-be-cc'},
'Ethernet30/1': {'actorOperKey': '0x00c8',
'actorPortId': 121,
'actorPortPriority': 32768,
'actorPortState': {'activity': True,
'aggregation': True,
'collecting': True,
'defaulted': False,
'distributing': True,
'expired': False,
'synchronization': True,
'timeout': False},
'actorPortStatus': 'bundled',
'partnerOperKey': '0x82af',
'partnerPortId': 259,
'partnerPortPriority': 32768,
'partnerPortState': {'activity': True,
'aggregation': True,
'collecting': True,
'defaulted': False,
'distributing': True,
'expired': False,
'synchronization': True,
'timeout': False},
'partnerSysId': '7F9B,00-23-04-ee-be-cc'}},
'markers': {'markers': ['*']}}
{'interfaces': {'Ethernet16/1': {'actorOperKey': '0x0385',
'actorPortId': 65,
'actorPortPriority': 32768,
'actorPortState': {'activity': True,
'aggregation': True,
'collecting': True,
'defaulted': False,
'distributing': True,
'expired': False,
'synchronization': True,
'timeout': False},
'actorPortStatus': 'bundled',
'partnerOperKey': '0x0001',
'partnerPortId': 49,
'partnerPortPriority': 32768,
'partnerPortState': {'activity': True,
'aggregation': True,
'collecting': True,
'defaulted': False,
'distributing': True,
'expired': False,
'synchronization': True,
'timeout': False},
'partnerSysId': '8000,28-99-3a-fa-50-fc'}},
'markers': {'markers': ['*']}}
{'interfaces': {'Ethernet11/1': {'actorOperKey': '0x0067',
'actorPortId': 45,
'actorPortPriority': 0,
'actorPortState': {'activity': False,
'aggregation': True,
'collecting': False,
'defaulted': True,
'distributing': False,
'expired': False,
'synchronization': False,
'timeout': False},
'actorPortStatus': 'noAgg',
'partnerOperKey': '0x0000',
'partnerPortId': 0,
'partnerPortPriority': 0,
'partnerPortState': {'activity': False,
'aggregation': False,
'collecting': False,
'defaulted': False,
'distributing': False,
'expired': False,
'synchronization': False,
'timeout': True},
'partnerSysId': '0000,00-00-00-00-00-00'},
'Ethernet11/2': {'actorOperKey': '0x0067',
'actorPortId': 46,
'actorPortPriority': 32768,
'actorPortState': {'activity': False,
'aggregation': True,
'collecting': False,
'defaulted': True,
'distributing': False,
'expired': False,
'synchronization': False,
'timeout': False},
'actorPortStatus': 'noAgg',
'partnerOperKey': '0x0000',
'partnerPortId': 0,
'partnerPortPriority': 0,
'partnerPortState': {'activity': False,
'aggregation': False,
'collecting': False,
'defaulted': False,
'distributing': False,
'expired': False,
'synchronization': False,
'timeout': True},
'partnerSysId': '0000,00-00-00-00-00-00'}},
'markers': {'markers': ['*']}}
【问题讨论】:
-
试试pprint 模块。如果您需要自己编写,则需要研究递归例程。
-
上面代码的错误在这里
print(v['interfaces']['actorPortPriority'])。您错过了密钥'Ethernet29/1'。 k 的值是“interfaces”,v 是interfaces内的dict,'Ethernet29/1'是第一个键。所以,上面的代码应该是print(v['Ethernet29/1']['actorPortPriority'])
标签: python json loops dictionary