Python逐行替换配置模板生成交换机配置时内容重复、替换不全如何解决
问题根因
- 逐行处理时对同一行执行了3次独立替换+写入操作:每次仅替换单个占位符就写入整行内容,导致每行重复输出3次,每次仅对应一个占位符被替换,其余占位符保留原值
- 替换逻辑未链式调用:字符串的
replace方法是返回新字符串,不会修改原字符串,代码没有把前一次替换的结果传入下一次替换,而是每次都基于原始行做替换,无法实现一行内多占位符同时替换 - 缺少
#default_gateway#占位符的替换逻辑:代码中已经计算出new_default_gateway变量,但未加入替换规则,导致该占位符始终未被替换 - 存在无效冗余逻辑:
while True循环无实际作用,执行一次就触发break,属于无用代码 - 文件操作未规范关闭:直接调用
open后没有执行close方法,可能导致文件缓冲区内容未完全写入磁盘,还存在资源泄漏风险
修正方案
- 将多次
replace链式调用,先完成当前行所有占位符的替换,再统一写入一次 - 新增
#default_gateway#的替换规则 - 移除无效的
while True循环 - 改用
with上下文管理器操作文件,自动处理文件关闭逻辑 - 可优化变量命名风格保持一致性,提升代码可读性
修正后完整代码
Network = input('Which Network is this config for? (Automation, CCTV or Corp): ') Unit = input('Which Unit? (A, B or C): ') Cab = input('Which Cab will the Switch be installed in? ') Number = input('What will the number of the Switch be? e.g. 01, 02 etc? ') Mgmt_vlan = input('What is the management vlan? ') Data_Vlan = input('What is the Data Vlan? ') default_gateway = '172.x.x.254' def generate_config(): if Network == 'Automation': Host_Name = f'Unit{Unit}_Auto_Sw{Cab}{Number}' Mgmt_ip = f'172.24.{Mgmt_vlan}.{Data_Vlan} 255.255.255.0' new_default_gateway = f'172.24.{Mgmt_vlan}.254' # 打印参数用于校验 print(Host_Name) print(Mgmt_ip) print(new_default_gateway) # 上下文管理器自动处理文件关闭 with open('config.txt', 'rt', encoding='utf-8') as fin, open(f'{Host_Name}.txt', 'wt', encoding='utf-8') as fout: for line in fin: # 完成所有占位符替换后仅写入一次 processed_line = line.replace('#host#', Host_Name)\ .replace('#mgmt#', Mgmt_vlan)\ .replace('#mgmt_ip#', Mgmt_ip)\ .replace('#default_gateway#', new_default_gateway) fout.write(processed_line) generate_config()
修正后输出效果
以你示例输入的参数为例,最终生成的配置文件内容如下:
en ! conf t ! hostname UnitA_Auto_SwQ01 ! vlan 63 ! int vlan 63 ip address 172.24.63.12 255.255.255.0 no shut ! ip default-gateway 172.24.63.254
内容的提问来源于stack exchange,提问作者Network_Engr_1664
相关产品推荐
相关产品推荐

