Python 打破while-True循环

Python 打破while-True循环,python,xml,while-loop,break,Python,Xml,While Loop,Break,我有一个python脚本,它将解析xml文件中的序列号,并将它们写入文本文件。下面代码的问题是,它正在进行无限循环。如果我在某个地方添加一个break语句,在登录到文件后,它只写入一个序列号。如何增加计数器,以便程序在写入所有序列号后退出 try: while True: data, addr = s.recvfrom(65507) mylist=data.split('\r') url = re.findall('http?://(?:[

我有一个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

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

while working == True:
然后在适当的时间重置标志

这允许您使用
else
语句关闭文本文件,并在while循环完成后输出最终结果

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

为了进行调试,您可以在每次写入文本文件时输出一条语句。

如果您的s.recvfrom(65507)工作正常,应该很容易修复。将此代码写在
数据的下方,addr=s.recvfrom(65507)


您打开一个
UDP
套接字,并使用
recvfrom
从套接字获取数据。
您设置了一个高的
超时
,使此函数成为
阻塞函数
。这意味着,当您开始监听套接字时,如果发送方没有发送数据,您的程序将在该行被阻止,直到发送方发送内容或
超时时间达到。如果
超时
且无数据,则函数将引发
异常

我看到两种选择:

  • 从发送方发送指示流结束的内容(您案例中的序列号)

  • 设置一个小的
    超时
    ,然后捕获
    异常
    ,并使用它来中断循环

另外,看看这个问题:


希望有帮助。

完成循环的条件是什么-您需要一些条件。谢谢@AChanpion-一旦所有序列号都写入文件。例如,它应该退出。如果len(data)==0,您不能退出
?您如何知道何时完成序列号的读取…“将解析xml文件”-但它看起来不像是在解析文件,而是在解析来自套接字的数据。套接字数据从何而来?它说“SyntaxError:invalid syntax”,具体在哪里?我的回答应该让你明白这里的概念到底是什么。你现在应该明白了。
if not data:
    break