2016-09-30 99 views
1

我有一个python脚本,将解析为序列号xml文件,并将它们写入一个文本文件了。下面的代码的问题是,它正在进行无限循环。如果我在登录到文件后添加一个break语句,它只写入一个序列号。如何增加计数器,以便程序在写完所有序列号后退出。打破的,而真正的循环

try: 
    while True: 
     data, addr = s.recvfrom(65507) 
     mylist=data.split('\r') 
     url = re.findall('http?://(?:[a-zA-Z]|[0-9]|[[email protected]&+]|[!*\(\),]|(?:%[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

完成循环的条件是什么 - 您需要一些条件。 – AChampion

+0

谢谢@AChanpion - 一旦所有连续数字都写入文件..它应该退出 –

+0

例如,如果len(data)== 0'不能退出'? –

回答

1

我通常会创建一个标志,以便同时将

while working == True: 

然后在适当的时候重新设置该标志。

这可以让你使用else语句来关闭文本文件和输出后while循环的最终结果是完整的。 Else clause on Python while statement

注意,它始终是最好明确关闭打开的文件完成后,而不是依赖于垃圾收集。您还应关闭该文件并在除外逻辑中输出超时消息。

要进行调试,可以输出每一个语句写入文本文件。

0

如果您s.recvfrom(65507)正常工作,应该是一个容易解决。写略低于您data, addr = s.recvfrom(65507)

if not data: 
    break 
+0

它说“SyntaxError:invalid syntax” –

+0

究竟在哪里?我的答案也应该让你明白这里的概念究竟是什么。你现在应该明白了。 –

0

这段代码打开一个UDP插槽,并使用recvfrom从插座上获取数据。
您设置了一个高位timeout,它使该功能成为blocking function。这意味着当您开始监听套接字时,如果发件人没有发送任何数据,则您的程序将在该线路上被阻止,直到发件人发送内容或timeout到达。如果是timeout且没有数据,则该函数将引发一个Exception

我看到两个选项:

  • 从指示流的末尾(在你的情况下,序列号)发送方发送的东西。

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

而且,看看这个问题:socket python : recvfrom

希望它能帮助。