繁体   English   中英

跳出 while True 循环

[英]Breaking out of while True loop

我有一个 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 循环完成后输出最终结果。 Python 上的 Else 子句 while 语句

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

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

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

if not data:
    break

您打开一个UDP套接字并使用recvfrom从该套接字获取数据。
你设置了一个高超时timeout ,这使得这个函数成为一个blocking function 这意味着当您开始侦听套接字时,如果没有从发送方发送任何数据,您的程序将在该线路上被阻塞,直到发送方发送某些内容或timeout到达。 如果timeout且没有数据,该函数将引发Exception

我看到两个选项:

  • 从发送者发送一些表明流结束的东西(在你的情况下是序列号)。

  • 设置一个小的timeout然后捕获Exception并使用它来中断循环。

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

希望能帮助到你。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM