2016-09-30 4 views
1

나는 일련 번호에 대한 xml 파일을 구문 분석하여 텍스트 파일에 쓰는 python 스크립트가 있습니다. 아래 코드의 문제점은 무한 루프에 있습니다. break 문을 파일에 기록한 후에 하나의 일련 번호 만 쓰는 경우를 생각해보십시오. 카운터를 늘리면 모든 일련 번호를 작성한 후 프로그램이 종료됩니다. 그동안이while while of while True 루프

while working == True: 

그런 다음 적절한 시간에 플래그를 재설정 될 수 있도록

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

나는 일반적으로 깃발을 만들 것입니다.

이렇게하면 else 문을 사용하여 텍스트 파일을 닫고 while 루프가 완료된 후 최종 결과를 출력 할 수 있습니다. Else clause on Python while statement.

가비지 수집에 의존하기보다는 완료된 파일을 명시 적으로 닫는 것이 항상 더 좋습니다. 또한 파일을 닫고 예외 로직에서 시간 초과 메시지를 출력해야합니다.

디버깅의 경우 텍스트 파일에 기록 할 때마다 명령문을 출력 할 수 있습니다.

0

s.recvfrom (65507)이 올바르게 작동하는 경우 쉽게 수정해야합니다. 당신은 UDP 소켓을 열고 소켓에서 데이터를 얻을 recvfrom를 사용하여 당신의 data, addr = s.recvfrom(65507)

if not data: 
    break 
+0

"SyntaxError : invalid syntax"가 표시됩니다. –

+0

정확히 어디입니까? 또한 내 대답은 당신이 정확히 여기에 개념이 무엇인지 이해하게해야합니다. 지금 넌 이해 했어야 해. –

0

아래에이 코드를 작성합니다.
timeout으로 설정하면이 기능이 blocking function이됩니다. 즉, 소켓에서 수신을 시작하면 보낸 사람이 보낸 데이터가 없으면 보낸 사람이 뭔가를 보내거나 timeout에 도달 할 때까지 프로그램이 해당 줄에서 차단됩니다. timeout이고 데이터가없는 경우 함수는 Exception을 발생시킵니다.

  • 하는 스트림의 마지막에 (귀하의 경우 일련 번호)를 나타냅니다 보낸 사람으로부터 뭔가를 보내기 :

    나는 두 가지 옵션을 참조하십시오.

  • 작은 timeout을 설정 한 다음 Exception을 잡아서 루프를 깨는 데 사용하십시오. 또한

는이 질문에 대해 살펴 : socket python : recvfrom

는 도움이되기를 바랍니다.