基于字典替换文件内容:替换主机IP时行数倍增问题求助
问题:替换配置文件中的主机IP时出现行数倍增问题
问题背景
现有两个文件:
- Inventory.txt(CSV格式,存储主机名与对应IP):
host2,service2,10.172.23.2,255.255.255.0,test2 host3,service3,10.172.23.3,255.255.255.0,test3 host4,service4,10.172.23.4,255.255.255.0,test4 host5,service5,10.172.23.5,255.255.255.0,test5
已通过以下代码提取主机名与IP构建字典:
import csv my_dict={} with open("Inventory.txt", 'r') as file: csvreader = csv.reader(file) for row in csvreader: my_dict[row[0]] = row[2]
- changer.txt(配置文件,部分主机IP需替换为Inventory.txt中的值):
cluster_info: esxi_name: "localhost.localdomain" esxi_datacenter: "Datacenter" esxi_datastore: "Datastore" host2: "10.172.23.10" host3: "10.76.23.56" packet_os_ipaddr: "10.164.243.118"
尝试替换时,以下代码导致临时文件行数倍增:
import csv my_dict={} with open("Inventory.txt", 'r') as file: csvreader = csv.reader(file) for row in csvreader: my_dict[row[0]] = row[2] new_file = open('temporary.txt', 'w') old_file = open('changer.txt','r') lines = old_file.readlines() for line in lines: for key in my_dict: new_file.write("\r"+key+": \""+my_dict[key]+"\"\n" if key in line else line)
错误原因
代码嵌套了两层循环:外层遍历配置文件的每一行,内层遍历字典的所有主机名。这导致每一行会被处理4次(字典含4个key):
- 若当前行不包含任何key,会重复写入4次原行
- 若当前行包含某个key,会写入1次替换后的行 + 3次原行
最终文件行数变为原文件的4倍。
修正后的代码
改为对每一行仅处理一次:检查该行是否匹配字典中的某个key,匹配则替换IP后写入,不匹配则直接写入原行。同时使用with语句自动管理文件句柄,避免资源泄漏:
import csv # 构建主机-IP字典 my_dict = {} with open("Inventory.txt", 'r') as file: csvreader = csv.reader(file) for row in csvreader: my_dict[row[0]] = row[2] # 处理配置文件替换 with open('changer.txt', 'r') as old_file, open('temporary.txt', 'w') as new_file: for line in old_file: # 去除换行符,方便后续匹配 stripped_line = line.strip() # 遍历字典,检查当前行是否为目标主机配置行 for key, ip in my_dict.items(): if stripped_line.startswith(f"{key}:"): # 匹配到主机,保留缩进并替换IP后写入 new_line = f" {key}: \"{ip}\"\n" new_file.write(new_line) break else: # 未匹配到任何主机,直接写入原行 new_file.write(line)
说明
- 使用
startswith(f"{key}:")精准匹配配置行,避免误替换包含主机名字符串的其他行 - 匹配到目标主机后立即
break,停止当前行的遍历,避免重复处理 - 保留配置文件的缩进格式(示例中主机行有4个空格缩进),确保配置文件格式合法
内容的提问来源于stack exchange,提问作者Dragos Cazangiu
相关产品推荐
相关产品推荐

