Netmiko获取交换机接口状态导入Pandas时的列错位问题
解决Netmiko获取交换机接口状态导入Pandas的列错位问题
问题根源
你当前代码的核心问题是浪费了Netmiko的TextFSM结构化解析能力:虽然调用send_command时加了use_textfsm=True,但后续又手动按换行和空格拆分原始文本——这种方式无法处理Name列含空格或为空的场景:空格会被误判为列分隔符,空值会导致后续列左移,最终数据完全错位。
修正后的代码
直接使用Netmiko返回的结构化数据(use_textfsm=True后返回的是列表嵌套字典,每个字典对应一行数据,键就是表头),不需要手动拆分文本:
from netmiko import ConnectHandler import pandas as pd def get_ip_address(): ip_address_request = input("请输入设备IP地址: ") return ip_address_request ip_address = get_ip_address() switch = { "device_type":"cisco_ios", "ip": ip_address, 'username': 'redacted', 'password': 'redacted', } net_connect = ConnectHandler(**switch) prompt = net_connect.find_prompt() hostname = prompt[:-1] # use_textfsm=True会直接返回结构化的列表字典 status_data = net_connect.send_command("show interface status", use_textfsm=True) net_connect.disconnect() # 直接转DataFrame status_df = pd.DataFrame(status_data) # 处理Name列的空值(如果有的话) status_df['Name'] = status_df['Name'].fillna('') # 按原始表头顺序调整列(确保和CLI输出一致) column_order = ['Port', 'Name', 'Status', 'Vlan', 'Duplex', 'Speed', 'Type'] status_df = status_df[column_order] pd.set_option('display.max_colwidth', None) print(status_df.to_string(index=False))
效果验证
修正后的数据会和手动CLI输出完全一致:
| Port | Name | Status | Vlan | Duplex | Speed | Type |
|---|---|---|---|---|---|---|
| Fa0/1 | PC DATA | connected | 1 | a-full | a-100 | 10/100BaseTX |
| Fa0/2 | PC DATA | notconnect | 1 | auto | auto | 10/100BaseTX |
| Fa0/3 | disabled | 1 | auto | auto | 10/100BaseTX | |
| Fa0/4 | connected | 1 | a-full | a-100 | 10/100BaseTX | |
| Fa0/5 | KRONOS | notconnect | 1 | auto | auto | 10/100BaseTX |
| Fa0/6 | KRONOS | notconnect | 1 | auto | auto | 10/100BaseTX |
关键说明
- TextFSM是Netmiko内置的结构化解析工具,针对Cisco等设备的CLI输出做了适配,能自动识别带空格的字段、空值,返回标准的键值对结构。
- 手动拆分文本的方式只适用于无空格、无空值的简单表格,复杂场景必须依赖结构化解析工具。
内容的提问来源于stack exchange,提问作者karoks
相关产品推荐
相关产品推荐

