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

基于字典替换文件内容:替换主机IP时行数倍增问题求助

问题:替换配置文件中的主机IP时出现行数倍增问题

问题背景

现有两个文件:

  1. 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]
  1. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 06:11:16