打破True循环

时间:2016-09-30 19:36:25

标签: python xml while-loop break

我有一个python脚本,它将解析xml文件中的序列号,并将它们写入文本文件。下面代码的问题是,它正在进行无限循环。如果我在记录到文件后添加一个break语句,它只写一个序列号。如何增加计数器,以便程序在写完所有序列号后退出。

try:
    while True:
        data, addr = s.recvfrom(65507)
        mylist=data.split('\r')
        url = re.findall('http?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', data)
        print url[0]
        response = urllib2.urlopen(url[0])
        the_page = response.read()

        tree = ET.XML(the_page)
        with open("temp.xml", "w") as f:
            f.write(ET.tostring(tree))

        document = parse('temp.xml')
        actors = document.getElementsByTagName("ns0:serialNumber")
        for act in actors:
            for node in act.childNodes:
                if node.nodeType == node.TEXT_NODE:
                        r = "{}".format(node.data)
                        print r
                        logToFile(str(r))

time.sleep(10)
        s.sendto(msg, ('239.255.255.250', 1900) )

except socket.timeout:
    pass

3 个答案:

答案 0 :(得分:1)

我通常会创建一个标志,以便while可以

department

然后在适当的时间重置标志。

这允许您使用while working == True: 语句关闭文本文件,并在while循环完成后输出最终结果。 Else clause on Python while statement

请注意,在完成时显式关闭打开文件总是更好,而不是依赖于垃圾回收。您还应关闭该文件并在except逻辑中输出超时消息。

对于调试,您可以在每次写入文本文件时输出语句。

答案 1 :(得分:0)

如果你的s.recvfrom(65507)工作正常,那应该是一个简单的解决方法。在data, addr = s.recvfrom(65507)

下方写下此代码
if not data:
    break

答案 2 :(得分:0)

您打开UDP套接字并使用recvfrom从套接字获取数据 您设置了一个高timeout,使此函数成为blocking function。这意味着当您开始收听套接字时,如果发件人没有发送任何数据,您的程序将被阻止在该行上,直到发件人发送内容或timeout到达。如果timeout且没有数据,则该函数将引发Exception

我看到两个选项:

  • 从发件人发送一些表示流结束的内容(您的案例中的序列号)。

  • 设置一个小timeout然后捕捉Exception并使用它来打破循环。

另外,请看一下这个问题:socket python : recvfrom

希望它有所帮助。