根据不同的用户输入替换字符串(模板配置)-Python

时间:2018-08-01 20:12:50

标签: python string replace

我现在使用Python已有3天了,请问菜鸟。

我正在编写一个程序,该程序将模板中的变量用于配置并有效地执行查找和替换。唯一不同的是,我希望它对用户是图形化的(稍后会出现),并且我希望它是动态的,以便变量可以在模板之间进行更改,即模板将以:

开头
@hostname
@username
@password

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

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

我的查找和替换工作正常-但是,由于程序在每个@variable之间循环,因此每次执行时都会复制我的模板。因此,在这种情况下,我最终将3个模板堆叠在一个txt文件中。

## 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倍。

我希望这很清楚。

谢谢

2 个答案:

答案 0 :(得分:1)

IDLE的示例:

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

一旦拥有了所需的所有数据(主机,用户,密码),就可以对字符串使用.format( )操作来替换上述字符串中的{}。如果字符串中有多个花括号对,请按照上面显示的顺序在方法中使用多个逗号分隔的参数。

答案 1 :(得分:0)

我不清楚您要做什么,所以这也许更适合发表评论,但是如果您可以解释为什么不执行以下操作,这将为您提供建议做你想做的事。

variable_names = #list variables here

variable_values={}
for variable_name in variable_names:
    variable_values[variable_name] = input("Please Enter " + variable_name + ": ")
with open("out.txt", "w") as fout:
    with open("TestTemplate.txt", "r+") as checkfin:
        for line in checkfin:
            for variable_name in variable_names:
                if variable_name in line:
                    line = line.replace(variable_name,variable_values[variable_name])
            fout.write(line)