我确定它是一件我能忽视的简单事物。我之前做过这种操作。我正在读取htmlfile,这是我的模板文件,并写入htmlfile2,这是我的实际报告。在任何人吓坏之前,HTML都不会在网站或其他任何东西上使用,它只是用作显示报告数据的便捷方式。我找到了rgraph,一个用于创建HTML5图形的工具,并且想到了,#34;哇,这是完美的!我现在甚至不必编写GUI代码,我可以轻松保存报告结果!"
我的htmlfile有几行注释,其中包含一些文本,告诉我的程序在htmlfile2中需要替换所述行。如果我使用print语句来检查哪些循环正在执行,那么每次都会执行正确的循环。由于某种原因,文本永远不会改变。好像写入函数发生了,但是没有工作,它无声地失败。模板中的值不在任何地方的python代码中,因此即使已经输入循环,写入也不会完成它的工作。我尝试了几个不同的if条件,只是为了看看是否会有任何变化,因此startwith vs ==等等。帮助???
def editHTML(self, searchT, replaceT):
if os.path.isfile('C:/MetReports/report.html'):
with open('C:/MetReports/report.html') as htmlfile:
with open('C:/MetReports/report2.html', 'w') as htmlfile2:
for line in htmlfile:
if searchT in line:
if searchT.startswith('REP1'):
tester = "\t\t\tvar meter = new RGraph.Meter('cvs', 0,100, " + str(replaceT) + ") //REP1\n"
htmlfile2.write(tester)
elif searchT == 'REP2':
tester2 = "\t\t\tvar meter = new RGraph.Meter('cvs2', 0,100, " + str(replaceT) + ") //REP2\n"
htmlfile2.write(tester2)
elif searchT == 'REP3':
htmlfile2.write("\t\t\tvar meter = new RGraph.Meter('cvs3', 0,1000, " + str(replaceT) + ") //REP3\n")
elif searchT == 'REP4':
htmlfile2.write("\t\t\tvar meter = new RGraph.Meter('cvs4', 0,30, " + str(replaceT) + ") //REP4\n")
elif searchT == 'REP5':
htmlfile2.write("\t\t\tvar meter = new RGraph.Meter('cvs5', 0,30, " + str(replaceT) + ") //REP5\n")
elif searchT not in line:
htmlfile2.write(line)
编辑以澄清:
来自htmlfile的示例行:
<canvas id="cvs" width="400" height="250" style="border: 1px solid #ccc; border-radius: 15px">[No canvas support]</canvas>
<script>
$(document).ready(function ()
{
var meter = new RGraph.Meter('cvs', 0,100, 25) //REP1
.set('angles.start', RGraph.PI - 0.5)
.set('angles.end', RGraph.TWOPI + 0.5)
25是输入循环并且searchT变量为subbed时应该改变的数字。所以示例运行如下:
editHTML('REP1', 30)
应该只更改上面的一行,将30替换为30。
编辑2:
正如我所想的那样,文本被其他if语句覆盖,当它不应该运行时。我在其中一次写入后放置&#34;退出(0)并检查我的文件,其中的信息对于该值是正确的。
编辑3:
评论中的解决方案。对于将来遇到类似问题的人,请记住,调试,调试,调试!逐步进入您的流程,您就会发现自己的问题。在我的情况下,我调用了一个函数,却没有意识到它会用输入文件的内容覆盖我的输出文件。
答案 0 :(得分:0)
为了解决我的问题,我不得不考虑两件事:循环结构和流程。我的main函数创建了一个具有editHTML函数的对象,在我的情况下,当我多次调用editHTML时,因为我是从静态文件(如果你愿意的话,模板)中读取并搜索过于特定的标准,我最终覆盖了行。我已经改变了整个结构,使其更简单。现在,editHTML只被调用一次,而不是必须关注我需要调用这个函数的次数,以及对我的文本会做什么,函数被调用一次,我需要它完成的所有工作在单次运行中执行,并在用户选择再次运行时自行重置。
现在它只需要优化。这是新的editHTML代码,它现在传递一个列表(而不是两个字符串),因为它是唯一的参数。
def editHTML(self, replaceT):
if os.path.isfile('C:/MetReports/report.html'):
with open('C:/MetReports/report.html') as htmlfile:
with open('C:/MetReports/report2.html', 'w') as htmlfile2:
fixer = '//REP'
count = 0
for line in htmlfile:
if line.find(fixer) == -1:
htmlfile2.write(line)
else:
if count == 0:
print("running 1")
htmlfile2.write("\t\t\tvar meter = new RGraph.Meter('cvs', 0,100, " + str(replaceT[0]) + ") //REP1\n")
elif count == 1:
print("running 2")
htmlfile2.write("\t\t\tvar meter = new RGraph.Meter('cvs2', 0,100, " + str(replaceT[1]) + ") //REP2\n")
elif count == 2:
print("running 3")
htmlfile2.write("\t\t\tvar meter = new RGraph.Meter('cvs3', 0,1000, " + str(replaceT[2]) + ") //REP3\n")
elif count == 3:
print("running 4")
htmlfile2.write("\t\t\tvar meter = new RGraph.Meter('cvs4', 0,30, " + str(replaceT[3]) + ") //REP4\n")
elif count == 4:
print("running 5")
htmlfile2.write("\t\t\tvar meter = new RGraph.Meter('cvs5', 0,30, " + str(replaceT[4]) + ") //REP5\n")
count += 1