python - 根据不同的用户输入替换字符串(模板配置) - 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 倍的输出。
我希望这很清楚。
谢谢你
解决方案
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。如果字符串中有多个花括号对,则在方法中使用多个逗号分隔的参数,如上所示,按照它们应该出现的顺序。
推荐阅读
- reactjs - 如何将客户表antd formatNumber
- postgresql - Laravel 作业失败导致 PostgreSQL 数据库锁定
- visual-studio-code - vscode remote-shh:在文件资源管理器中切换用户
- node.js - 在我的应用中显示用户状态(在线或离线)
- python - 是否有函数可以获取 pandas 数据帧时间序列上两个值之间的差异?
- javascript - 时刻UTC时间如何转换为秒
- python - Python将文件从当前路径移动到与被移动文件类似或相似的特定文件夹
- amazon-web-services - 使用 lambda 目的地时是否需要私有链接
- java - java 8中的内存区方法区、字符串常量池位于哪个内存区?
- 3d - 添加 3D 模型:支持哪些类型的文件?以及在哪里托管 3D 文件?