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

如何使用pandas将网络配置文本转为结构化表格,实现非固定跳行的通用读取方案

通用网络配置文本转结构化表格实现方案

核心思路为放弃固定行号匹配,改为基于区块特征字符串定位,只要配置文件的结构特征(块标题、表头内容)不变,不管行号怎么变动都能正常解析。

实现逻辑

  • 第一步:将整个txt文件一次性读取为行列表,过滤无意义的空行
  • 第二步:通过特征关键词匹配定位三个核心区块的起止位置:
    • 接口描述块:以Interface Status Protocol Description为表头,到- VLAN + IP address行结束
    • 接口IP块:以Interface IP-Address OK? Method Status Protocol为表头,到- Subnet Mask行结束
    • 子网掩码块:所有以Internet address is 开头的行
  • 第三步:分别解析三个区块的内容,统一接口命名(将短名Vlxxx映射为长名Vlanxxx方便关联),最后合并为完整表格

完整代码

import pandas as pd
import re

# 1. 读取所有行并预处理
with open('MLAN_LLD.txt', 'r', encoding='utf-8') as f:
    lines = [line.strip() for line in f if line.strip()]

# 2. 定位各区块边界
# 接口描述块起止
desc_start = next(i for i, line in enumerate(lines) if line.startswith('Interface') and 'Description' in line)
desc_end = next(i for i, line in enumerate(lines) if line == '- VLAN + IP address')
# 接口IP块起止
ip_start = next(i for i, line in enumerate(lines) if line.startswith('Interface') and 'IP-Address' in line)
ip_end = next(i for i, line in enumerate(lines) if line == '- Subnet Mask')
# 子网掩码块
mask_lines = [line for line in lines if line.startswith('Internet address is')]

# 3. 解析接口描述块
desc_data = []
for line in lines[desc_start+1:desc_end]:
    # 按2个以上空格分割
    parts = re.split(r'\s{2,}', line, maxsplit=3)
    # 补全缺失的描述字段
    if len(parts) == 3:
        parts.append('')
    desc_data.append({
        'interface': parts[0].replace('Vl', 'Vlan'), # 统一命名格式
        'status': parts[1],
        'protocol': parts[2],
        'description': parts[3]
    })
df_desc = pd.DataFrame(desc_data)

# 4. 解析接口IP块
ip_data = []
for line in lines[ip_start+1:ip_end]:
    parts = re.split(r'\s{2,}', line)
    ip_data.append({
        'interface': parts[0],
        'ip_address': parts[1],
        'ok': parts[2],
        'method': parts[3],
        'status_ip': parts[4],
        'protocol_ip': parts[5]
    })
df_ip = pd.DataFrame(ip_data)

# 5. 解析子网掩码,生成IP和前缀的映射表
ip_mask_map = {}
for line in mask_lines:
    ip_cidr = re.search(r'(\d+\.\d+\.\d+\.\d+/\d+)', line).group(1)
    ip, mask = ip_cidr.split('/')
    ip_mask_map[ip] = mask

# 6. 关联所有数据
df_merge = pd.merge(df_desc, df_ip, on='interface', how='left')
# 给IP匹配子网掩码
df_merge['subnet_mask'] = df_merge['ip_address'].map(ip_mask_map)

# 输出最终结果
print(df_merge)

方案优势

  • 不依赖任何固定行号,只要配置文件的块标题、表头格式不变,就能适配不同长度的配置文件
  • 内置接口命名统一逻辑,避免Vlxxx和Vlanxxx无法关联的问题
  • 正则分割适配多空格分隔的不规则格式,比pandas默认的sep参数兼容性更好

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 06:45:04