2013-12-11 4 views
-3

Я пытаюсь написать код python для извлечения данных. Это почти правильно, но кажется, что он висит ближе к концу первого файла. Есть где-то бесконечный цикл?Код висит, бесконечный цикл?

train = open('mp_crf_train.txt', 'r') 
lines = train.readlines() 
number = 0 

for i in lines: 
    filename = str(number) + ".txt" 
    outfile = open(filename,"w") 
    lst = i.split(' ') 
    x=1 
    #while x < len(lst): 
    for word in lst: 
     if '<' in word and '/' not in word: 
      sword = word[1:len(word)-1] 
      close = '</'+ sword + '>' 
      while lst[x] != close: 
        outfile.write(lst[x]) 
        outfile.write(' ') 
        outfile.write(sword) 
        outfile.write('\n') 
        if x!=len(lst)-1: 
         x=x+1 
      x=x+1 
    number = number+1 
+1

Что делать, если это 'while' цикл никогда не находит 'close'? – user2357112

+0

И что произойдет, если у вас есть вложенные теги? – user2357112

+3

Вам не нужно спрашивать нас, есть ли у вас бесконечный цикл. Распечатайте некоторые отладочные заявления, и вы узнаете. Я бы посоветовал вам узнать, как отлаживать вообще. – keyser

ответ

3

Это постановки бесконечного цикла. Если вы достигнете конца lst, не найдя close, вы находитесь в бесконечном цикле, так как вы защищаете от увеличения x. Если вы были, получив индексную ошибку (скорее всего) - ваше исправление проверки x по длине вызвало бесконечный цикл.

 while lst[x] != close: 
       ... 
       if x!=len(lst)-1: 
        x=x+1 

То, что вы, вероятно, следует использовать это

 while x<len(lst) and lst[x] != close: 
       ... 
       x=x+1 

или так как вы, кажется, не нужно x

 for item in lst: 
      if item == close: 
       break 
      ... 

Если вам нужно следить за x

 for x, item in enumerate(lst): 
      if item == close: 
       break 
      ... 
+0

Спасибо! Использовал ваше первое предложение. – user2951046

+0

@ user2951046 Если ответ gnibbler полезен для вас, отметьте ответ как принятый. –

2

Ум, да. Откуда вы знаете, что этот цикл

 while lst[x] != close: 

когда-нибудь закончится? Является close обязательно в list? Как насчет пробелов (я полагаю, это HTML или что-то пустое невежество)? Вы полагаете, что закрывающая фигурная скобка именно формы '</'+ sword + '>'

+1

HTML не является обычным языком, поэтому, предполагая, что OP пытается использовать регулярное выражение для синтаксического анализа, это просто жестоко. – geoffspear

+0

Point. Удалены. – rspencer

1

Единственное место, которое может стать бесконечным циклом здесь:

while lst[x] != close: 

который будет infinte если lst[x] является никогдаclose. Сделайте print(lst[x]) на каждой итерации (или просто проверьте линии relvant в своем outfile), и сравните его с тем, что вы ожидаете - вероятная тривиальная разница, которую вы пропустили.

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