Python 的 TTP(模板文本解析器)输出不是正确的字典

问题描述 投票:0回答:1

我可能做错了什么,但使用 Cisco WLC 的 Netmiko 输出作为 TTP 的输入,最终结果不是真正的字典。

第1步:这是我的脚本:

with ConnectHandler(**device) as net_connect:
    wlc_hostname = net_connect.find_prompt()[:-1]
    data_to_parse = net_connect.send_command('show run | sec ^wlan.+_([0-9])+_GuestNet')
    print (data_to_parse)

ttp_template = """
<template name="GUEST_wlan_profile">
<group name="{{ wlan_profile }}">
wlan {{ wlan_profile }} {{ wlan_id }} {{ ssid }}
 security wpa psk set-key ascii {{ psk-encrp-method }} {{ guest-psk | ORPHRASE }}
 shutdown  {{ state | set ("disabled") }}
</group>
</template>
"""

parser = ttp(data=data_to_parse, template=ttp_template)
parser.parse()

cisco_wlanTemplates = parser.result(structure="dictionary")
print(json.dumps(cisco_wlanTemplates, sort_keys=True, indent=4, separators=(',', ': ')))

for cisco_wlan in cisco_wlanTemplates:
    print ('WLAN Profile: ',*cisco_wlan)

这是 Netmiko 输出:

wlan GUEST_local 49 GuestSSID
 assisted-roaming prediction
 client association limit radio 31
 description "Guest with local forwarding"
 no security ft adaptive
 security wpa psk set-key ascii 8 TaIQFQeIOPX^ZCIEbbggNLMiFNGSAYVBecRF
 no security wpa akm dot1x
 security wpa akm psk
 no shutdown

这是解析器输出:

{
    "GUEST_wlan_profile": [
        {
            "GUEST_local": {
                "guest-psk": "TaIQFQeIOPX^ZCIEbbggNLMiFNGSAYVBecRF",
                "psk-encrp-method": "8",
                "ssid": "GuestNet",
                "wlan_id": "49"
            }
        }
    ]
}

这是我打印字典项目得到的:

WLAN Profile:  G U E S T _ w l a n _ p r o f i l e

如果我尝试从假定的嵌套字典中获取第一个元素,这就是我得到的结果: 代码:

for cisco_wlan in cisco_wlanTemplates:
    print ('WLAN Profile: ',cisco_wlan[0])

输出:

WLAN Profile:  G

第 2 步: 现在使用此输出,我得到了不同的打印结果:

代码:

ttp_template = """
<template name="GUEST_wlan_profile">
<group name="{{ wlan_profile }}">
wlan {{ wlan_profile }} {{ wlan_id }} {{ ssid }}
<group>
 security wpa psk set-key ascii {{ psk-encrp-method }} {{ guest-psk | ORPHRASE }}
 shutdown  {{ state | set ("disabled") }}
</group>
</group>
</template>
"""

# create parser object and parse data using template:
parser = ttp(data=data_to_parse, template=ttp_template)
parser.parse()

cisco_wlanTemplates = parser.result(format='json')[0]
print(cisco_wlanTemplates)

输出:

[
    {
        "GUEST_local": [
            {
                "ssid": "GuestNet",
                "wlan_id": "49"
            },
            {
                "guest-psk": "TaIQFQeIOPX^ZCIEbbggNLMiFNGSAYVBecRF",
                "psk-encrp-method": "8"
            }
        ]
    }
]

出于某种原因,在我看来,TTP 的输出创建了一个带有字典列表的初始字典,我不知道如何访问键和值。

我想通过 TTP 完成的是访问“guest-psk”来修改它,并在将来修改原始 Netmiko 输出中的其他功能,因此我需要嵌套字典来覆盖 Cisco 中所有不同的“WLAN 配置文件”设置设备。 这次我不想使用另一个解析器,也不想使用正则表达式来完成此任务。

python-3.x text-parsing
1个回答
0
投票

我终于找到问题所在了,解析器输出的结构应该是“flat_list”:

cisco_wlanTemplates = parser.result(structure="flat_list")
© www.soinside.com 2019 - 2024. All rights reserved.