You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas处理Cisco交换机端口数据输出异常,求提取Port列方法

解决Cisco IOS接口状态Port列提取问题

问题根源

show interface status的原始输出包含交换机banner、命令回显头、空行等冗余内容,直接转成DataFrame会导致结构混乱,这也是你用df.iloc或df[:,0]失效的原因——DataFrame的行/列根本没对应正确的表格数据。

方案1:手动清理输出后转DataFrame

先过滤掉非表格内容,只保留有效接口数据行:

from netmiko import ConnectHandler
import pandas as pd
import re

# 交换机连接配置
device = {
    'device_type': 'cisco_ios',
    'ip': '你的交换机IP',
    'username': '账号',
    'password': '密码',
}

# 执行命令获取输出
conn = ConnectHandler(**device)
raw_output = conn.send_command('show interface status')
conn.disconnect()

# 1. 拆分输出为行,过滤空行和空白行
lines = [line.strip() for line in raw_output.splitlines() if line.strip()]

# 2. 定位表格起始行(包含"Port"表头的行)
start_idx = next(i for i, line in enumerate(lines) if 'Port' in line)

# 3. 提取表头后的所有行,再过滤仅保留接口行(根据你的设备接口前缀调整,比如Gi/Fa/Te)
valid_lines = [line for line in lines[start_idx+1:] if line.startswith(('Gi', 'Fa', 'Te', 'Et'))]

# 4. 用正则拆分多空格分隔的表格行,生成DataFrame
df = pd.DataFrame(
    [re.split(r'\s{2,}', line) for line in valid_lines],
    columns=['Port', 'Name', 'Status', 'Vlan', 'Duplex', 'Speed', 'Type']
)

# 提取纯Port列数据
port_list = df['Port'].tolist()
print(port_list)

方案2:用TextFSM自动解析(推荐)

Netmiko内置支持TextFSM,可以直接将命令输出转换成结构化数据,无需手动清理:

from netmiko import ConnectHandler
import pandas as pd

device = {
    'device_type': 'cisco_ios',
    'ip': '你的交换机IP',
    'username': '账号',
    'password': '密码',
}

conn = ConnectHandler(**device)
# 使用use_textfsm=True触发结构化解析
structured_output = conn.send_command('show interface status', use_textfsm=True)
conn.disconnect()

# 直接转成DataFrame
df = pd.DataFrame(structured_output)

# 提取Port列(注意TextFSM返回的列名是小写的port)
port_list = df['port'].tolist()
print(port_list)

关键说明

  • TextFSM方案更稳定,能适配不同IOS版本的输出格式差异
  • 手动清理时要根据你的设备接口前缀调整过滤规则,避免漏掉或误包含行
  • 之前的索引操作无效是因为原始DataFrame结构错误,不是方法本身问题

内容的提问来源于stack exchange,提问作者Luc_08

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 08:15:52