如何使用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
相关产品推荐
相关产品推荐

