【发布时间】:2018-02-23 02:23:30
【问题描述】:
我正在编写一个 python 脚本来解析 1000 个 Rancid 文件,这些文件包含网络上一堆路由器的所有配置信息、型号、软件类型、软件版本等。到目前为止,我已经让它正确地遍历所有文件,并按主机名、软件类型(IE IOS、IOS XR、JUNOSE、JUNOS 等)以及软件版本的路由器打印出一个不错的路由器列表是(IE 12.3R7、15.2(2)T1、12.1.1p0.1 等)。
问题在于,网络团队可以随时添加新的路由器型号、将软件升级到未知版本或其他任何方式,通过为每种路由器类型、软件版本和依此类推,需要对脚本进行持续维护,而我不想这样做,因此我将所有变量设为动态。它遍历文件,找到正确的软件类型、版本和模型(因为每个供应商通常不会更改版本之间的呈现方式)。然后将变量分配为“模型”、“类型”和“版本”,然后将其打印出来。
我希望能够将 argparse 添加到我的代码中,以便在需要时而不是打印整个列表时,我可以得到一个带有计数的摘要,因此在循环的每次传递中,我让它添加它找到的值每个键字典的多值。
这是字典的构建方式,以及它是如何打印出来的。
我将密钥设置为基于主机名的文件名(因此更少解析原始数据以获取更多信息)
key = file
mydict.setdefault(key, [])
mydict[key].append(model)
mydict[key].append(type)
mydict[key].append(version)
#here is an example of what the dictionary looks like
print mydict
{'router1': ['model1', 'JUNOS', '12.3R7'], 'router2': ['model1', 'JUNOS',
'13.3R4'], 'router3': ['model2', 'IOS', '15.2'], 'router4': ['model3',
'JUNOS', '11.4R1'], 'router5': ['model2', 'IOS', '15.3'], 'router6':
['model4', 'JUNOSe', '12.1.1p0.1'], 'router7': ['model1', 'JUNOS',
'12.3R7'], 'router7': ['model1', 'JUNOS', '12.3R7'], 'router8': ['model1',
'JUNOS', '13.3R4'], 'router9': ['model2', 'IOS', '15.2'], 'router10':
['model3', 'JUNOS', '11.4R1'], 'router11': ['model2', 'IOS', '15.3'],
'router12': ['model5', 'JUNOS', '12.3R7']}
我想要的是一种方法来匹配所有 3 个值都相同的所有重复项,对它们进行计数,然后将它们打印在一个格式良好的列表中(忽略键,因为打印它并不重要对于这个练习)
JUNOS model1 12.3R7 3
JUNOS model1 13.3R4 2
JUNOS model3 11.4R1 2
JUNOS model5 12.3R7 1
IOS model2 15.2 2
IOS model2 15.3 2
JUNOSE model4 12.1.1p0.1 1
或者更可取(但可能要困难得多)
JUNOS
model1 12.3R7 2
13.3R4 2
model3 11.4R1 2
model5 12.3R7 1
JUNOSE
model2 12.1.1p0.1 1
IOS
model2 15.2 2
15.3 2
【问题讨论】:
标签: python dictionary counting