我的字典似乎覆盖而不是用新行更新?
My dict appears to overwrite and not update with new rows?
给定以下代码:
https://bpaste.net/show/dd44a1fa01dc
from ciscoconfparse import CiscoConfParse
from pprint import pprint
parse = CiscoConfParse("testconfig.txt", syntax="junos")
interfaces = {}
intfs = parse.find_objects_w_parents(r'^interface', r'^\s+ge-')
for intfobj in intfs:
intf_name = intfobj.text.strip()
interfaces.update({'name': intf_name})
descr = intfobj.re_match_iter_typed(r'description\s+"(\S.+?)"$', group=1)
interfaces.update({'description': descr})
mode = intfobj.re_match_iter_typed(r'port-mode\s+(\S+)\s*$', group=1,
all_children=True)
interfaces.update({'mode': mode})
print (interfaces)
使用以下测试数据:
https://bpaste.net/show/df422a96aaae
interfaces {
ge-2/0/0 {
description "site1;;hostname1;ge-16/0/9;;;TRUST;";
unit 0 {
family ethernet-switching {
port-mode trunk;
}
}
}
ge-2/0/2 {
description "site2;;hostname2;ge-16/0/8;;;TRUST;";
unit 0 {
family ethernet-switching {
port-mode trunk;
}
}
}
vstp {
bpdu-block-on-edge;
vlan VLAN_0005 {
interface ge-2/0/0 {
edge;
}
}
vlan VLAN_0015 {
interface ge-2/0/0 {
edge;
}
interface ge-2/0/2 {
edge;
}
}
}
}
我想了解为什么我的 interfaces = {} 只包含一行:
{'name': 'ge-2/0/2', 'description': 'site2;;hostname2;ge-16/0/8;;;TRUST;', 'mode': 'trunk'}
我希望它包含来自测试数据的两个接口:
{'name': 'ge-2/0/0', 'description': 'site1;;hostname1;ge-16/0/9;;;TRUST;', 'mode': 'trunk'}
{'name': 'ge-2/0/2', 'description': 'site2;;hostname2;ge-16/0/8;;;TRUST;', 'mode': 'trunk'}
您正在创建字典并更新其值。所以你最终得到一个带有最后值的字典。
您可以使用字典列表,例如:
from ciscoconfparse import CiscoConfParse
from pprint import pprint
parse = CiscoConfParse("testconfig.txt", syntax="junos")
interfaces = []
intfs = parse.find_objects_w_parents(r'^interface', r'^\s+ge-')
for intfobj in intfs:
interface = {}
interface['name'] = intfobj.text.strip()
interface['description'] = intfobj.re_match_iter_typed(r'description\s+"(\S.+?)"$', group=1)
interface['mode'] = intfobj.re_match_iter_typed(r'port-mode\s+(\S+)\s*$', group=1,
all_children=True)
interfaces.append(interface)
print (interfaces)
可以试试这样的
allInterfaces = {}
interfaces = {}
intfs = parse.find_objects_w_parents(r'^interface', r'^\s+ge-')
for intfobj in intfs:
intf_name = intfobj.text.strip()
interfaces.update({'name': intf_name})
descr = intfobj.re_match_iter_typed(r'description\s+"(\S.+?)"$', group=1)
interfaces.update({'description': descr})
mode = intfobj.re_match_iter_typed(r'port-mode\s+(\S+)\s*$', group=1,
all_children=True)
interfaces.update({'mode': mode})
allInterfaces = allInterfaces + [interfaces,]
打印(所有接口)
给定以下代码:
https://bpaste.net/show/dd44a1fa01dc
from ciscoconfparse import CiscoConfParse
from pprint import pprint
parse = CiscoConfParse("testconfig.txt", syntax="junos")
interfaces = {}
intfs = parse.find_objects_w_parents(r'^interface', r'^\s+ge-')
for intfobj in intfs:
intf_name = intfobj.text.strip()
interfaces.update({'name': intf_name})
descr = intfobj.re_match_iter_typed(r'description\s+"(\S.+?)"$', group=1)
interfaces.update({'description': descr})
mode = intfobj.re_match_iter_typed(r'port-mode\s+(\S+)\s*$', group=1,
all_children=True)
interfaces.update({'mode': mode})
print (interfaces)
使用以下测试数据:
https://bpaste.net/show/df422a96aaae
interfaces {
ge-2/0/0 {
description "site1;;hostname1;ge-16/0/9;;;TRUST;";
unit 0 {
family ethernet-switching {
port-mode trunk;
}
}
}
ge-2/0/2 {
description "site2;;hostname2;ge-16/0/8;;;TRUST;";
unit 0 {
family ethernet-switching {
port-mode trunk;
}
}
}
vstp {
bpdu-block-on-edge;
vlan VLAN_0005 {
interface ge-2/0/0 {
edge;
}
}
vlan VLAN_0015 {
interface ge-2/0/0 {
edge;
}
interface ge-2/0/2 {
edge;
}
}
}
}
我想了解为什么我的 interfaces = {} 只包含一行:
{'name': 'ge-2/0/2', 'description': 'site2;;hostname2;ge-16/0/8;;;TRUST;', 'mode': 'trunk'}
我希望它包含来自测试数据的两个接口:
{'name': 'ge-2/0/0', 'description': 'site1;;hostname1;ge-16/0/9;;;TRUST;', 'mode': 'trunk'}
{'name': 'ge-2/0/2', 'description': 'site2;;hostname2;ge-16/0/8;;;TRUST;', 'mode': 'trunk'}
您正在创建字典并更新其值。所以你最终得到一个带有最后值的字典。 您可以使用字典列表,例如:
from ciscoconfparse import CiscoConfParse
from pprint import pprint
parse = CiscoConfParse("testconfig.txt", syntax="junos")
interfaces = []
intfs = parse.find_objects_w_parents(r'^interface', r'^\s+ge-')
for intfobj in intfs:
interface = {}
interface['name'] = intfobj.text.strip()
interface['description'] = intfobj.re_match_iter_typed(r'description\s+"(\S.+?)"$', group=1)
interface['mode'] = intfobj.re_match_iter_typed(r'port-mode\s+(\S+)\s*$', group=1,
all_children=True)
interfaces.append(interface)
print (interfaces)
可以试试这样的
allInterfaces = {}
interfaces = {}
intfs = parse.find_objects_w_parents(r'^interface', r'^\s+ge-')
for intfobj in intfs:
intf_name = intfobj.text.strip()
interfaces.update({'name': intf_name})
descr = intfobj.re_match_iter_typed(r'description\s+"(\S.+?)"$', group=1)
interfaces.update({'description': descr})
mode = intfobj.re_match_iter_typed(r'port-mode\s+(\S+)\s*$', group=1,
all_children=True)
interfaces.update({'mode': mode})
allInterfaces = allInterfaces + [interfaces,]
打印(所有接口)