2016-09-30 3 views
1

У меня есть скрипт python, который будет анализировать xml-файл для серийных номеров и будет записывать их в текстовый файл. Проблема с приведенным ниже кодом заключается в том, что он идет бесконечным циклом. Если я добавляю оператор break, где после входа в файл он записывает только один серийный номер. Как увеличить счетчик, чтобы программа выходила после записи всех серийных номеров.Извлечение из while True loop

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

Например, вы не можете выйти из 'if 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

В нем говорится: «Синтаксис: поврежденный синтаксис» –

+0

Где именно? Также мой ответ должен помочь вам понять, что здесь представляет собой концепция. Вы должны были понять это. –

0

Открываешь UDP разъем и использовать recvfrom, чтобы получить данные из сокета.
Вы устанавливаете высокий timeout, который делает эту функцию blocking function. Это означает, что когда вы начинаете прослушивать сокет, если никакие данные не были отправлены от отправителя, ваша программа будет заблокирована на этой строке, пока отправитель не отправит что-либо или не достигнет timeout. В случае timeout и без данных функция поднимет Exception.

Я вижу два варианта:

  • Отправить что-то от отправителя, который указывает на конец потока (серийные номера в вашем случае).

  • Установите маленький timeout, затем поймайте Exception и используйте его, чтобы разбить петлю.

Кроме того, обратите внимание на этот вопросе: socket python : recvfrom

Надеется, что это помогает.

 Смежные вопросы

  • Нет связанных вопросов^_^