2013-12-11 91 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

點。刪除。 – rspencer

1

只有一個地方,這可以成爲一個無限循環的是在這裏:

while lst[x] != close: 

如果lst[x]從未close將被infinte。在每次迭代時都做一個print(lst[x])(或者只需檢查outfile中的相關行),並將其與您所期望的相比較 - 您可能錯過了一個微不足道的差異。