【发布时间】:2020-12-16 19:34:12
【问题描述】:
首先我是 Python 编程的新手,因此非常感谢任何帮助。我在组合来自不同字典的相同键值时遇到问题,因此它是一个键值对。我尝试了这里提供的许多解决方案,但似乎都不适用于我的情况。我知道我做错了什么。输出来自解析两个单独的基于文本的配置。这一切都在同一个巨大的 masterDict 字典中结束。我可以更改它,以便每个文件生成一个单独的字典,但我希望它可以扩展到最多 4 个嵌套字典。 0 是第一个文件,1 是第二个文件。这是字典的摘要版本。
masterDict = {0: {'access': {'interface GigabitEthernet0/1': ' switchport access vlan 532'},
'description': {'interface GigabitEthernet0/1': ' description Printer'},
'duplex': {'interface GigabitEthernet0/1': ' duplex half'},
'speed': {'interface GigabitEthernet0/1': ' speed 10'},
'trunk': {'interface GigabitEthernet0/1': 'switchport mode trunk'}},
1: {'access': {'interface GigabitEthernet0/2': ' switchport access vlan 532'},
'description': {'interface GigabitEthernet0/2': ' description Printer'},
'duplex': {'interface GigabitEthernet0/2': ' duplex half'},
'speed': {'interface GigabitEthernet0/2': ' speed 10'},
'trunk': {'interface GigabitEthernet0/2': 'switchport mode trunk'}}}
我希望最终结果如下所示:
newMasterDict = {0: {'interface GigabitEthernet0/1': [' switchport access vlan 532',
' description Printer',
' duplex half',
' speed 10',
'switchport mode trunk']},
1: {'newDict': {'interface GigabitEthernet0/2': [' switchport access vlan 532',
' description Printer',
' duplex half',
' speed 10',
'switchport mode trunk']}}}
请注意,键不会出现在每个字典中。有人可以指出我正确的方向吗?非常感谢!
masterDict 的生成方式如下:
from ciscoconfparse import CiscoConfParse
from collections import defaultdict
homepath = 'c:/Users/c_eavila/Box/Projects/Environment1/'
pathList = ("testconfig.txt", "testconfig2.txt")
queryList = ('description', 'speed', 'duplex')
swpModes = ("access", "trunk")
masterDict = {}
masterDict2 = {}
for count, path in enumerate(pathList):
dictList = {}
loadParse = CiscoConfParse(config=homepath+path , ignore_blank_lines=True, syntax='ios')
for mode in swpModes:
if mode == "access":
parentParse = loadParse.find_parents_w_child(r'^interface', r'switchport mode '+mode)
accVlanParse = loadParse.find_children_w_parents(r'^interface', r'switchport access vlan')
accVlanDict = dict(zip(parentParse, accVlanParse))
dictList['access'] = accVlanDict
elif mode == "trunk":
v = 'switchport mode trunk'
parentParse = loadParse.find_parents_w_child(r'^interface', r'switchport mode '+mode)
trunkAllowedParse = loadParse.find_children_w_parents(r'^interface', r'switchport trunk allowed')
if trunkAllowedParse != []:
trunkAllowedDict = dict(zip(parentParse, trunkAllowedParse))
trunkDict = dict(zip(parentParse, 'switchport mode trunk',))
dictList['trunkallowed'] = trunkAllowedDict
dictList['trunk'] = {k:v for k in trunkDict}
elif trunkAllowedParse == []:
trunkDict = dict(zip(parentParse, 'switchport mode trunk',))
dictList['trunk'] = {k:v for k in trunkDict}
for query in queryList:
parentParse = loadParse.find_parents_w_child(r'^interface', query)
childParse = loadParse.find_children_w_parents(r'^interface', query)
dictList[query] = dict(zip(parentParse, childParse))
masterDict[count] = dictList
这是配置的摘录。随意复制、粘贴并自己尝试一下。目标是只提取查询的行。
interface GigabitEthernet0/1
switchport access vlan 532
switchport mode access
switchport voice vlan 45
switchport port-security maximum 50
switchport port-security
switchport port-security aging time 5
switchport port-security aging type inactivity
auto qos voip cisco-phone
spanning-tree portfast
!
interface GigabitEthernet0/2
switchport access vlan 532
switchport mode access
switchport voice vlan 45
switchport port-security maximum 50
switchport port-security
switchport port-security aging time 5
switchport port-security aging type inactivity
auto qos voip cisco-phone
spanning-tree portfast
!
interface GigabitEthernet0/3
description UPS
switchport access vlan 15
switchport mode access
switchport voice vlan 45
switchport port-security maximum 50
switchport port-security
switchport port-security aging time 5
switchport port-security aging type inactivity
auto qos voip cisco-phone
spanning-tree portfast
!
interface GigabitEthernet0/4
switchport access vlan 532
switchport mode access
switchport voice vlan 45
switchport port-security maximum 50
switchport port-security
switchport port-security aging time 5
switchport port-security aging type inactivity
auto qos voip cisco-phone
spanning-tree portfast
!
interface GigabitEthernet0/5
description Office 207 port 226a Plotter
switchport access vlan 50
switchport mode access
switchport voice vlan 45
switchport port-security maximum 50
switchport port-security
switchport port-security aging time 5
switchport port-security aging type inactivity
speed 10
duplex full
auto qos voip cisco-phone
spanning-tree portfast
!
interface GigabitEthernet0/6
switchport access vlan 532
switchport mode access
switchport voice vlan 45
switchport port-security maximum 50
switchport port-security
switchport port-security aging time 5
switchport port-security aging type inactivity
auto qos voip cisco-phone
spanning-tree portfast
!
interface GigabitEthernet0/7
description Printer Ray Rm 210
switchport access vlan 50
switchport mode access
switchport voice vlan 45
switchport port-security maximum 50
switchport port-security
switchport port-security aging time 5
switchport port-security aging type inactivity
auto qos voip cisco-phone
spanning-tree portfast
!
interface GigabitEthernet0/8
switchport access vlan 532
switchport mode access
switchport voice vlan 45
switchport port-security maximum 50
switchport port-security
switchport port-security aging time 5
switchport port-security aging type inactivity
auto qos voip cisco-phone
spanning-tree portfast
编辑:非常感谢@GhandiFloss 和@JoshuaSundance 的帮助。 @GhandiFloss 的解决方案似乎适用于我在上面发布的摘要字典。但是,它不适用于我的完整词典。我正在尝试调整代码以使其正常运行。同样,任何指向正确方向的点都将不胜感激! 这是完整的字典:请注意,它可能是从两个几乎相同的配置生成的字典的两倍。我希望最多能做 4 个。
masterDict = {0: {'access': {'interface GigabitEthernet0/1': ' switchport access vlan 532',
'interface GigabitEthernet0/10': ' switchport access vlan 532',
'interface GigabitEthernet0/11': ' switchport access vlan 532',
'interface GigabitEthernet0/12': ' switchport access vlan 532',
'interface GigabitEthernet0/13': ' switchport access vlan 50',
'interface GigabitEthernet0/14': ' switchport access vlan 50',
'interface GigabitEthernet0/15': ' switchport access vlan 532',
'interface GigabitEthernet0/16': ' switchport access vlan 532',
'interface GigabitEthernet0/17': ' switchport access vlan 532',
'interface GigabitEthernet0/18': ' switchport access vlan 50',
'interface GigabitEthernet0/19': ' switchport access vlan 532',
'interface GigabitEthernet0/2': ' switchport access vlan 532',
'interface GigabitEthernet0/20': ' switchport access vlan 50',
'interface GigabitEthernet0/21': ' switchport access vlan 532',
'interface GigabitEthernet0/22': ' switchport access vlan 532',
'interface GigabitEthernet0/23': ' switchport access vlan 532',
'interface GigabitEthernet0/24': ' switchport access vlan 598',
'interface GigabitEthernet0/25': ' switchport access vlan 50',
'interface GigabitEthernet0/26': ' switchport access vlan 64',
'interface GigabitEthernet0/27': ' switchport access vlan 64',
'interface GigabitEthernet0/28': ' switchport access vlan 64',
'interface GigabitEthernet0/29': ' switchport access vlan 50',
'interface GigabitEthernet0/3': ' switchport access vlan 15',
'interface GigabitEthernet0/30': ' switchport access vlan 532',
'interface GigabitEthernet0/31': ' switchport access vlan 50',
'interface GigabitEthernet0/32': ' switchport access vlan 532',
'interface GigabitEthernet0/33': ' switchport access vlan 532',
'interface GigabitEthernet0/34': ' switchport access vlan 50',
'interface GigabitEthernet0/35': ' switchport access vlan 50',
'interface GigabitEthernet0/36': ' switchport access vlan 64',
'interface GigabitEthernet0/37': ' switchport access vlan 64',
'interface GigabitEthernet0/38': ' switchport access vlan 532',
'interface GigabitEthernet0/39': ' switchport access vlan 532',
'interface GigabitEthernet0/4': ' switchport access vlan 532',
'interface GigabitEthernet0/40': ' switchport access vlan 50',
'interface GigabitEthernet0/41': ' switchport access vlan 50',
'interface GigabitEthernet0/42': ' switchport access vlan 50',
'interface GigabitEthernet0/43': ' switchport access vlan 532',
'interface GigabitEthernet0/44': ' switchport access vlan 50',
'interface GigabitEthernet0/45': ' switchport access vlan 50',
'interface GigabitEthernet0/46': ' switchport access vlan 532',
'interface GigabitEthernet0/47': ' switchport access vlan 532',
'interface GigabitEthernet0/48': ' switchport access vlan 532',
'interface GigabitEthernet0/5': ' switchport access vlan 50',
'interface GigabitEthernet0/6': ' switchport access vlan 532',
'interface GigabitEthernet0/7': ' switchport access vlan 50',
'interface GigabitEthernet0/8': ' switchport access vlan 532',
'interface GigabitEthernet0/9': ' switchport access vlan 50'},
'description': {'interface GigabitEthernet0/13': ' description Printer',
'interface GigabitEthernet0/14': ' description Printer '
'216',
'interface GigabitEthernet0/17': ' description bpdu '
'8-19-20 cp',
'interface GigabitEthernet0/18': ' description FMA 200A '
'Printer',
'interface GigabitEthernet0/20': ' description Printer '
'209',
'interface GigabitEthernet0/24': ' description Wireless',
'interface GigabitEthernet0/25': ' description Printer',
'interface GigabitEthernet0/26': ' description Camera',
'interface GigabitEthernet0/27': ' description Camera',
'interface GigabitEthernet0/28': ' description Camera',
'interface GigabitEthernet0/3': ' description UPS',
'interface GigabitEthernet0/35': ' description FMA '
'Printer 204',
'interface GigabitEthernet0/36': ' description Camera',
'interface GigabitEthernet0/37': ' description Camera',
'interface GigabitEthernet0/40': ' description Printer',
'interface GigabitEthernet0/41': ' description Printer',
'interface GigabitEthernet0/45': ' description Printer',
'interface GigabitEthernet0/5': ' description Office 207 '
'port 226a Plotter',
'interface GigabitEthernet0/51': ' description trunktest',
'interface GigabitEthernet0/7': ' description Printer Ray '
'Rm 210',
'interface GigabitEthernet0/9': ' description Printer 213',
'interface Vlan1000': ' description Management VLAN'},
'duplex': {'interface GigabitEthernet0/36': ' duplex half',
'interface GigabitEthernet0/5': ' duplex full',
'interface GigabitEthernet0/51': ' duplex full'},
'speed': {'interface GigabitEthernet0/36': ' speed 10',
'interface GigabitEthernet0/5': ' speed 10',
'interface GigabitEthernet0/51': ' speed 100'},
'trunk': {'interface GigabitEthernet0/49': ' switchport mode trunk',
'interface GigabitEthernet0/50': ' switchport mode trunk',
'interface GigabitEthernet0/51': ' switchport mode trunk'},
'trunkallowed': {'interface GigabitEthernet0/49': ' switchport trunk '
'allowed vlan 50'}},
1: {'access': {'interface GigabitEthernet0/1': ' switchport access vlan 532',
'interface GigabitEthernet0/10': ' switchport access vlan 532',
'interface GigabitEthernet0/11': ' switchport access vlan 532',
'interface GigabitEthernet0/12': ' switchport access vlan 532',
'interface GigabitEthernet0/13': ' switchport access vlan 50',
'interface GigabitEthernet0/14': ' switchport access vlan 50',
'interface GigabitEthernet0/15': ' switchport access vlan 532',
'interface GigabitEthernet0/16': ' switchport access vlan 532',
'interface GigabitEthernet0/17': ' switchport access vlan 532',
'interface GigabitEthernet0/18': ' switchport access vlan 50',
'interface GigabitEthernet0/19': ' switchport access vlan 532',
'interface GigabitEthernet0/2': ' switchport access vlan 532',
'interface GigabitEthernet0/20': ' switchport access vlan 50',
'interface GigabitEthernet0/21': ' switchport access vlan 532',
'interface GigabitEthernet0/22': ' switchport access vlan 532',
'interface GigabitEthernet0/23': ' switchport access vlan 532',
'interface GigabitEthernet0/24': ' switchport access vlan 598',
'interface GigabitEthernet0/25': ' switchport access vlan 50',
'interface GigabitEthernet0/26': ' switchport access vlan 64',
'interface GigabitEthernet0/27': ' switchport access vlan 64',
'interface GigabitEthernet0/28': ' switchport access vlan 64',
'interface GigabitEthernet0/29': ' switchport access vlan 50',
'interface GigabitEthernet0/3': ' switchport access vlan 15',
'interface GigabitEthernet0/30': ' switchport access vlan 532',
'interface GigabitEthernet0/31': ' switchport access vlan 50',
'interface GigabitEthernet0/32': ' switchport access vlan 532',
'interface GigabitEthernet0/33': ' switchport access vlan 532',
'interface GigabitEthernet0/34': ' switchport access vlan 50',
'interface GigabitEthernet0/35': ' switchport access vlan 50',
'interface GigabitEthernet0/36': ' switchport access vlan 64',
'interface GigabitEthernet0/37': ' switchport access vlan 64',
'interface GigabitEthernet0/38': ' switchport access vlan 532',
'interface GigabitEthernet0/39': ' switchport access vlan 532',
'interface GigabitEthernet0/4': ' switchport access vlan 532',
'interface GigabitEthernet0/40': ' switchport access vlan 50',
'interface GigabitEthernet0/41': ' switchport access vlan 50',
'interface GigabitEthernet0/42': ' switchport access vlan 50',
'interface GigabitEthernet0/43': ' switchport access vlan 532',
'interface GigabitEthernet0/44': ' switchport access vlan 50',
'interface GigabitEthernet0/45': ' switchport access vlan 50',
'interface GigabitEthernet0/46': ' switchport access vlan 532',
'interface GigabitEthernet0/47': ' switchport access vlan 532',
'interface GigabitEthernet0/48': ' switchport access vlan 532',
'interface GigabitEthernet0/5': ' switchport access vlan 50',
'interface GigabitEthernet0/6': ' switchport access vlan 532',
'interface GigabitEthernet0/7': ' switchport access vlan 50',
'interface GigabitEthernet0/8': ' switchport access vlan 532',
'interface GigabitEthernet0/9': ' switchport access vlan 50'},
'description': {'interface GigabitEthernet0/13': ' description Printer',
'interface GigabitEthernet0/14': ' description Printer '
'216',
'interface GigabitEthernet0/17': ' description bpdu '
'8-19-20 cp',
'interface GigabitEthernet0/18': ' description FMA 200A '
'Printer',
'interface GigabitEthernet0/20': ' description Printer '
'209',
'interface GigabitEthernet0/24': ' description Wireless',
'interface GigabitEthernet0/25': ' description Printer',
'interface GigabitEthernet0/26': ' description Camera',
'interface GigabitEthernet0/27': ' description Camera',
'interface GigabitEthernet0/28': ' description Camera',
'interface GigabitEthernet0/3': ' description UPS',
'interface GigabitEthernet0/35': ' description FMA '
'Printer 204',
'interface GigabitEthernet0/36': ' description Camera',
'interface GigabitEthernet0/37': ' description Camera',
'interface GigabitEthernet0/40': ' description Printer',
'interface GigabitEthernet0/41': ' description Printer',
'interface GigabitEthernet0/45': ' description Printer',
'interface GigabitEthernet0/5': ' description Office 207 '
'port 226a Plotter',
'interface GigabitEthernet0/51': ' description trunktest',
'interface GigabitEthernet0/7': ' description Printer Ray '
'Rm 210',
'interface GigabitEthernet0/9': ' description Printer 213',
'interface Vlan1000': ' description Management VLAN'},
'duplex': {'interface GigabitEthernet0/36': ' duplex half',
'interface GigabitEthernet0/5': ' duplex full',
'interface GigabitEthernet0/51': ' duplex full'},
'speed': {'interface GigabitEthernet0/36': ' speed 10',
'interface GigabitEthernet0/5': ' speed 10',
'interface GigabitEthernet0/51': ' speed 100'},
'trunk': {'interface GigabitEthernet0/49': ' switchport mode trunk',
'interface GigabitEthernet0/50': ' switchport mode trunk',
'interface GigabitEthernet0/51': ' switchport mode trunk'}}}
【问题讨论】:
-
你能说明最初的 masterDict 是如何生成的吗?
-
刚刚编辑了我的帖子。如果有不清楚的地方,请告诉我。谢谢!
标签: python dictionary parsing merge key