首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >根据不同的用户输入替换字符串(模板配置)- Python

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

Stack Overflow用户
提问于 2018-08-02 04:12:50
回答 2查看 214关注 0票数 0

我现在已经使用Python 3天了,所以请原谅我的新手。

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

代码语言:javascript
复制
@hostname
@username
@password

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

代码语言:javascript
复制
hostname @hostname
login @username privilege 15 @password enc sha256

我让find和replace运行得很好--然而,当程序在每个@变量之间循环时,它会在每次执行时复制我的模板。因此,在这种情况下,我最终会将3个模板堆叠在一个txt文件中。

代码语言:javascript
复制
## 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倍的输出。

我希望这是很清楚的。

谢谢

EN

回答 2

Stack Overflow用户

发布于 2018-08-02 04:19:05

一个来自IDLE的例子:

代码语言:javascript
复制
>>> fmtstr = "hostname {} login {} privilege 15 {} enc sha256"
>>> print (fmtstr.format("legitHost", "notahacker", "hunter2"))
hostname legitHost login notahacker privilege 15 hunter2 enc sha256

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

票数 1
EN

Stack Overflow用户

发布于 2018-08-02 05:00:35

我不太清楚你在尝试做什么,所以这可能更适合作为评论,但如果你能解释为什么你没有做下面的事情,这将有助于给你关于如何做你正在尝试做的事情的建议。

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51641586

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档