Python函数中的for循环防止函数的进一步迭代

时间:2015-08-06 16:23:27

标签: python flask

我有一个Flask应用程序,它运行的python函数不能正常工作。我已经确定问题的根源是函数中的for循环,但我不明白它为什么会产生问题或者如何产生问题。

我的烧瓶应用程序启动一个网络服务器,允许用户按下按钮选择"按ID搜索"或者"按日期搜索。"然后,它会将它们指向与其搜索选择相对应的不同页面,并允许它们执行搜索,从而在新选项卡中显示包含结果的html文件。然后,搜索页面会根据按钮选择重定向回原始页面。该应用程序的代码如下:

from flask import Flask, render_template, redirect, request, url_for
from xml_identifiersearch import searchXML, printHTML

app = Flask(__name__)

@app.route('/') 
def index():
     return render_template('index.html')       

@app.route('/', methods=['POST'])
def gateway():
    if request.form['submit'] == 'Identifier Search':
        return redirect(url_for('identifier_home'))
    else:
        return redirect(url_for('date_home'))

@app.route('/id/')
def identifier_home():
    return render_template('id_home.html')

@app.route('/id/', methods=['POST'])
def identifier_search():
    printHTML(request.form['input'])
    return redirect(url_for('index'))

@app.route('/date/')
def date_home():
    return render_template('date_home.html')

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000,debug=True)

问题在于" printHTML"当我不在其体内包含for循环时,此功能正常工作,但一旦我这样做,问题就开始出现了。该函数的代码如下:

from xml.dom import minidom
import glob
import os
import webbrowser
import random

def searchXML(identifier):
    li = []
    os.chdir('/Users/dinakarguthy/Documents/audit_sample')
    for files in glob.glob("*.xml"):
        with open(files) as f:
            contents=f.read()
        if identifier in contents:
            li.append(files)
    return li

def printHTML(search):    

    f = open("output.html", "w")           #output to a single html file

    print >>f, '<html><head><link rel="stylesheet" type="text/css" href="my_style.css"></head><body><table border="1">'

    print >>f, random.random()*100

    for fileName in searchXML(search):           #search and print a row for each file

        xmldoc=minidom.parse('/Users/dinakarguthy/Documents/audit_sample/' + fileName)   #parse the file
        commonBase=xmldoc.childNodes[1]
        contextData=commonBase.childNodes[1]
        contextValue = contextData.childNodes[1]
        y = contextValue.childNodes[0]

        print >>f, "<tr>"                                                                    
        print >>f, "<td rowspan = '2'>" + fileName + "</td>"                                          
        print >>f, "</tr>"

        print >>f, "<tr>"
        for data in xmldoc.getElementsByTagName('extendedDataElements'):                   #Descriptions
            print >>f, "<td>"
            print >>f, "</td>"

        print >>f, "</tr>"


     print >>f, "</table></body></html>"

    f.close()
    """open html page that was created on webbrowser"""
    new=2
    url="file:///Users/dinakarguthy/Documents/main3/output.html"
    webbrowser.open(url,new=new)

问题在于:当我包含以

开头的for循环时
for filenames in searchXML(search):

整个功能仅在我第一次调用它时起作用。之后,当我调用该函数时,它仍然运行,我的烧瓶应用程序工作正常,但所有函数调用之间包括行

f = open('output.html', 'w')
f.close()

不要跑。行下面的函数部分

f.close()

仍在运行。因此,仍然会打开一个显示文件output.html的新选项卡,但该文件尚未被该函数的其余部分覆盖甚至截断。这可以通过每次运行函数时生成并显示在文件顶部的随机数来证明,但此随机数不再更改。

然而,如果没有for循环,该函数可以正常工作,并且每次都会向文件写入一个新的随机数。使用for循环,它只在第一次工作,之后每次都无法运行行

 f = open('output.html', 'w')

以及其下的所有相关内容。更令人好奇的是,如果我添加其他类似功能的功能,我甚至无法输出或写入 OTHER 文件。如果我在没有for循环的情况下运行其他函数,一切都正常运行,直到我用for循环运行这个函数,然后就不再输出任何东西了。

我知道这是一个很长的问题,但我真的很感激一些帮助,因为没有任何事情是有道理的。

1 个答案:

答案 0 :(得分:0)

我自己解决了这个问题。问题在于函数“searchXML”,它在for循环中调用。该功能使用线

os.chdir('/Users/dinakarguthy/Documents/audit_sample')

但打开文件的行只是

f = open('output.html', 'w')

我用相对路径名打开文件,而不是绝对,这就是问题所在。运行for循环后,我的目录将更改为另一个目录,因此在该otehr目录中创建/编辑了不同的output.html文件。但是,我的函数仍会打开一个带有'output.html'的选项卡,该选项卡仍在原始目录中。