JSON格式网络设备配置取值报错求助:TypeError列表索引问题
问题:处理JSON格式网络设备配置时触发TypeError错误
处理一段JSON格式的网络设备配置片段时遇到问题,已知append函数末尾需获取键而非值,但当前执行i['policy']['name']时触发TypeError: list indices must be integers or slices, not str报错。
相关配置片段
"policy": [ { "from-zone-name": "admin", "to-zone-name": "Switches", "policy": [ { "name": "admin-Switches", "match": { "source-address": [ "any" ], "destination-address": [ "any" ], "application": [ "any" ] }, "then": { "permit": [ "None" ] } } ] } ]
相关Python代码
data = self.dev.rpc.get_config(filter_xml='security', options={'format': 'json'}) self.policies = data['configuration']['security']['policies']['policy'] for i in self.policies: self.data.append([i['from-zone-name'], i['to-zone-name'], i['policy']['name'], i['policy']['match']['source-address'], i['policy']['match']['destination-address'], i['policy']['match']['application'], i['policy']['then'].keys()]) print(self.data)
报错信息
i['policy']['name'], TypeError: list indices must be integers or slices, not str
问题原因与解决方案
原因
从配置片段可以清晰看到:i['policy']是一个列表(数组),而非单个字典对象。列表只能使用整数索引或切片来访问元素,直接用字符串'name'索引自然会触发TypeError。
解决方案
由于每个from-zone-name+to-zone-name的组合下可能包含多个policy,最通用的做法是嵌套遍历i['policy']列表;如果确定每个组合下只有一个policy,也可以直接通过索引0获取元素。
修改后的代码(通用版)
data = self.dev.rpc.get_config(filter_xml='security', options={'format': 'json'}) self.policies = data['configuration']['security']['policies']['policy'] for i in self.policies: # 遍历当前zone组合下的所有policy for policy in i['policy']: self.data.append([ i['from-zone-name'], i['to-zone-name'], policy['name'], policy['match']['source-address'], policy['match']['destination-address'], policy['match']['application'], list(policy['then'].keys()) # 将dict_keys对象转为列表,避免后续处理问题 ]) print(self.data)
简化版(仅当每个zone组合下只有一个policy时适用)
data = self.dev.rpc.get_config(filter_xml='security', options={'format': 'json'}) self.policies = data['configuration']['security']['policies']['policy'] for i in self.policies: policy = i['policy'][0] # 直接取列表第一个元素 self.data.append([ i['from-zone-name'], i['to-zone-name'], policy['name'], policy['match']['source-address'], policy['match']['destination-address'], policy['match']['application'], list(policy['then'].keys()) ]) print(self.data)
内容的提问来源于stack exchange,提问作者OVDC
相关产品推荐
相关产品推荐

