我有一个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
答案 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
希望它有所帮助。