Python 打破while-True循环
我有一个python脚本,它将解析xml文件中的序列号,并将它们写入文本文件。下面代码的问题是,它正在进行无限循环。如果我在某个地方添加一个break语句,在登录到文件后,它只写入一个序列号。如何增加计数器,以便程序在写入所有序列号后退出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?://(?:[
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