首页 > 解决方案 > 根据不同的用户输入替换字符串(模板配置) - Python

问题描述

我现在已经使用 Python 3 天了,所以请原谅这个菜鸟。

我正在编写一个程序,它将在配置模板中获取变量并有效地进行查找和替换。唯一的区别是我希望它对用户来说是图形的(稍后会出现)并且我希望它是动态的,因此变量可以在模板之间改变,即模板将以:

@hostname
@username
@password

下面的配置将在需要的地方包含@hostname 等。

hostname @hostname
login @username privilege 15 @password enc sha256

我的查找和替换工作良好 - 但是随着程序在每个 @variable 之间循环,它会在每次执行时复制我的模板。所以在这种情况下,我最终会在一个 txt 文件中堆叠 3 个模板。

## OPEN TEMPLATE
with open("TestTemplate.txt", "rt") as fin:
    with open("out.txt", "w") as fout:
    ## PULLING VARIABLE NAMES
        for line in fin:
            if line.startswith("@"):
                trimmedLine = line.rstrip()
            ## USER ENTRY ie Please Enter @username: 
                entry = input("Please Enter " + trimmedLine + ": ")
                ## Open file again to start line loop from the top without affecting the above loop
                with open("TestTemplate.txt", "r+") as checkfin:
                    for line in checkfin:
                        if trimmedLine in line:
                            fout.write(line.replace(trimmedLine, entry))
                        else:
                        ## ENSURE ALL LINES UNAFFECTED ARE WRITTEN
                            fout.write(line)

正如您所看到的,当它写入所有行时,无论是否不受影响,它都会为循环中的每次迭代执行此操作。我需要它只覆盖受影响的行,同时保留所有其他未受影响的行。我可以让它们输出的唯一方法是输出每一行,fout.write(line)但这意味着我得到了 3 倍的输出。

我希望这很清楚。

谢谢你

标签: pythonstringreplace

解决方案


IDLE 的一个例子:

>>> fmtstr = "hostname {} login {} privilege 15 {} enc sha256"
>>> print (fmtstr.format("legitHost", "notahacker", "hunter2"))
hostname legitHost login notahacker privilege 15 hunter2 enc sha256

获得所需的所有数据(主机、用户、密码)后,您可以使用.format( )对字符串的操作来替换{}所述字符串中的 s。如果字符串中有多个花括号对,则在方法中使用多个逗号分隔的参数,如上所示,按照它们应该出现的顺序。


推荐阅读