Python处理网络设备接口TXT:删除指定行并转CSV
网络设备接口TXT文件清理与CSV转换
需求
处理网络设备接口信息的TXT文件,通过Python实现以下操作:
- 读取文件,删除包含日期的行、空白行、横线分隔行
- 保留有效接口数据后转换为CSV格式
此前尝试用Pandas的read_fwf方法结合正则删除行未成功,后续用循环+正则的代码也无法正常运行,以下是详细内容:
原始TXT内容
Wed Oct 12 12:53:38.816 EDT # 需要删除这行带日期的内容 # 需要删除这个空白行 Interface Status Protocol Description -------------------------------------------------------------------------------- # 需要删除这行横线分隔的内容 Lo0 up up Loopback0 interface configured by Netmiko Lo55 up up Lo100 up up ***MERGE LOOPBACK 100**** Lo111 up up Configured by NETCONF Nu0 up up Mg0/RP0/CPU0/0 up up DO NOT TOUCH THIS ! Gi0/0/0/0 admin-down admin-down Gi0/0/0/1 admin-down admin-down test Gi0/0/0/1.100 admin-down admin-down Gi0/0/0/2 admin-down admin-down Link to P2 configured by Netmiko Gi0/0/0/3 up up Configured by Ansible !!!!!!!! Gi0/0/0/4 up up Updated by Ansible using Jinja Template Gi0/0/0/5 up up Configured by Ansible !!!!!! Gi0/0/0/6 admin-down admin-down Updated by Ansible using Jinja Template Gi0/0/0/6.11 admin-down admin-down
期望输出(清理后的TXT)
Interface Status Protocol Description Lo0 up up Loopback0 interface configured by Netmiko Lo55 up up Lo100 up up ***MERGE LOOPBACK 100**** Lo111 up up Configured by NETCONF Nu0 up up Mg0/RP0/CPU0/0 up up DO NOT TOUCH THIS ! Gi0/0/0/0 admin-down admin-down Gi0/0/0/1 admin-down admin-down test Gi0/0/0/1.100 admin-down admin-down Gi0/0/0/2 admin-down admin-down Link to P2 configured by Netmiko Gi0/0/0/3 up up Configured by Ansible !!!!!!!! Gi0/0/0/4 up up Updated by Ansible using Jinja Template Gi0/0/0/5 up up Configured by Ansible !!!!!! Gi0/0/0/6 admin-down admin-down Updated by Ansible using Jinja Template Gi0/0/0/6.11 admin-down admin-down
尝试过的失败代码
Pandas方案
import pandas as pd df = pd.read_fwf("file.txt") df = df[~df[0:].str.contains("Wed")] print(df)
问题:df[0:]是DataFrame切片,无法直接调用str.contains方法;仅匹配"Wed"无法覆盖所有日期格式,逻辑不完整。
循环正则方案
with open("output.txt", "r") as f: lines = f.readlines() with open("output2.txt", "w") as f: for line in lines: if re.match(r"([A-Za-z0-9]+( [A-Za-z0-9]+)+)\-{5}\w", line): del line[line] f.write(line)
问题:正则表达式逻辑错误,无法匹配目标行;del line[line]写法完全错误,字符串不能通过该方式删除内容,且未导入re模块。
可行解决方案
方案1(MosGeo提供)
import re import pandas as pd with open("output.txt", "r") as f: lines = f.readlines() new_lines = [] for line in lines: stripped_line = line.strip() # 跳过横线行(至少5个-)、空白行、日期行 if not re.match(r"^-{5,}|^\s*$|^[A-Za-z]{3}\s[A-Za-z]{3}\s\d{2}", stripped_line): new_lines.append(stripped_line + "\n") # 写入清理后的TXT with open("cleaned_interfaces.txt", "w") as file: file.writelines(new_lines) # 转换为CSV df = pd.read_fwf("cleaned_interfaces.txt") df.to_csv("interfaces.csv", index=False)
说明:优化正则表达式精准匹配需删除的行,先生成清理后的TXT,再用read_fwf读取并转换为CSV。
方案2(预编译正则版)
import re import pandas as pd # 预编译正则,匹配需删除的行:横线行、空白行、日期行 regex = re.compile(r"^-{5,}|^\s*$|^[A-Za-z]{3}\s[A-Za-z]{3}\s\d{2}") with open("output.txt", "r") as f: lines = f.readlines() with open("cleaned_interfaces.txt", "w") as fw: for line in lines: stripped_line = line.strip() if not regex.match(stripped_line): fw.write(stripped_line + "\n") # 转换为CSV df = pd.read_fwf("cleaned_interfaces.txt") df.to_csv("interfaces.csv", index=False)
说明:预编译正则提升运行效率,逻辑更清晰,完整实现清理+转CSV的需求。
内容的提问来源于stack exchange,提问作者Martin Barbieri
相关产品推荐
相关产品推荐

