<p>我正在写一个程序,可以从模板中提取变量,并有效地查找/替换到模板中。你知道吗</p>
<p>模板示例:</p>
<pre><code>VARIABLES
@username
@password
@secret
###########################################################
My username is @username
Password is @password
Secret is @secret
</code></pre>
<p>程序将找到每个变量并逐个请求用户输入,打开文件,保存内容,然后关闭文件,为下一个变量做好准备。你知道吗</p>
<p>除了一个奇怪的以外,一切正常。一旦我运行了代码,我的文本文件的结尾似乎有点疯狂。参见下面的输出。正如您所见,它成功地获取并放置了变量,但是它在末尾添加了“TESTis TESTetis@secret”</em>?你知道吗</p>
<pre><code>VARIABLES
User
Pass
TEST
###########################################################
My username is User
Password is Pass
Secret is TESTis TESTis TESTetis @secret
</code></pre>
<p>我是Python新手(本周),请原谅下面的代码。我用自己独特的方式让它工作!它可能不是最有效的。只是努力想知道额外的钱是怎么加上去的。你知道吗</p>
<p>代码:</p>
<pre><code>##COPY CONTENTS FROM READ ONLY TO NEW FILE
with open("TestTemplate.txt", "rt") as fin:
with open("out.txt", "wt") as fout:
for line in fin:
fout.write(line)
fin.seek(0)
fout.seek(0)
fin.close()
fout.close()
##PULL VARIABLES AND FIND/REPLACE CONTENTS
with open("out.txt", "rt") as fin:
with open("out.txt", "rt") as searchf:
with open("out.txt", "r+") as fout:
for line in fin:
if line.startswith("@"):
trimmedLine = line.rstrip()
## USER ENTRY
entry = input("Please Enter " + trimmedLine + ": ")
for line in searchf:
## ENSURE ONLY VARIABLES AFTER '#' ARE EDITED. KEEPS IT NEAT
if trimmedLine in line:
fout.write(line.replace(trimmedLine,entry))
else:
fout.write(line)
##RESET FOCUS TO THE TOP OF THE FILE READY FOR NEXT ITERATION
searchf.seek(0)
fout.seek(0)
</code></pre>
<p>提前谢谢</p>
<p>替换字符串比原始模板的占位符短,因此在执行文件查找后会产生剩余字符。您应该在调用<code>seek()</code>之前截断文件,以便可以修剪结尾处的多余字符。你知道吗</p>
<pre><code>##RESET FOCUS TO THE TOP OF THE FILE READY FOR NEXT ITERATION
searchf.seek(0)
fout.truncate()
fout.seek(0)
</code></pre>