[英]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.