从一个文件读到另一个文件

时间:2014-06-17 13:26:27

标签: python python-3.x file-io formatting html-parsing

我确定它是一件我能忽视的简单事物。我之前做过这种操作。我正在读取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:

评论中的解决方案。对于将来遇到类似问题的人,请记住,调试,调试,调试!逐步进入您的流程,您就会发现自己的问题。在我的情况下,我调用了一个函数,却没有意识到它会用输入文件的内容覆盖我的输出文件。

1 个答案:

答案 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