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

希望它能幫助。