2014-12-01 36 views
0

我的打印語句的輸出輸出正確的數據行,但輸出文件僅包含3條if語句的最後一行。我試圖改變身份,但這似乎只會對代碼產生負面影響。打印語句正常時將輸出寫入文件的問題

import sys 
import tokenize 

file = [] 

f = open('Database.txt') # Opening File 

for line in f: 
file.append(line) # Reading in File 

f.close() # Closing File 

f = open('output.txt', 'w') 

for line in file: # Printing out File 
#print line 

    tokens = line.split() # splits lines along white-space (tokenise) 
    #print tokens 
    desired = '{0:<5}'.format(tokens[0]) 
    #print desired 
    lined = line.split('|') # lhs is original line  

    if 'Not present in Line' in line: 
     line1 = desired + ':' + lined[1] 
     #print line1 

    if 'Not present in TV' in line: 
     #print line 
     line2 = desired + ' : ' + ' sticking ' + ' Returning ' + '\n' 
     #print line2 

    if 'Not present in Line' not in line and 'Not present in TV' not in line: 
     #print line 
     line3 = desired + ':' + lined[1] 
     #print line3 

f.write(line1 + line2 + line3) 

f.close() 
+0

您還需要縮進第9行:'file.append(line)',否則它不在'for'循環中。 – moopet 2016-11-22 13:39:28

回答

3

您需要縮進線

f.write(line1 + line2 + line3) 

到相同的水平之前,if語句。目前,它位於for循環之外,因此僅在循環結束後才執行。

此外,您可能希望每行後添加一個換行符:

f.write(line1 + line2 + line3 + "\n") 

由於喬恩克萊門特已經正確地指出,你需要考慮,如果不是所有的三個if條件都滿足時發生什麼 - 在在這種情況下,lineN變量可能未定義,或者仍可能使用上一次迭代的值定義。實際上,在同時滿足所有三個條件的情況下,它是不可能的,因此在第一次迭代期間您總是會遇到NameError

只有您可以決定將它們設置爲for循環開始處的默認值還是做其他事情時是否有意義。

+2

值得一提的是,'line1','line2'和'line3'在某些時候不會被定義爲引起'NameError',否則可能具有來自* previous *行的值,這可能是不希望的。 – 2014-12-01 16:28:42

+0

是的,當我縮進if語句時,line1變爲NameError。我如何解決這個問題?謝謝 – 2014-12-01 16:57:18

+0

@AmyRose:好吧,有一種可能性(正如我在最後一段中所建議的那樣)將所有三個設置爲默認值,例如'for'循環開始處的'line1 = line2 = line3 =「」' 。 – 2014-12-01 17:13:53