2012-03-09 99 views
-1

我正在編寫一個解析器,其中兩行被比較在一起('mainline'可以這麼說,行之前它)。如果兩條線都匹配,主線將被丟棄。我只希望這發生在僅包含換行符或回車換行符的行上。所以我有這樣的代碼Python:在if語句中使用'or'會導致代碼執行,即使條件不被滿足

lastline = 0 
pointer = 0 
for lines in fileLines: 
    mainline = fileLines[pointer] 
    if lastline != 0: 
     print "Last Line: ",lastline 
     print "This Line: ",mainline 
     if lastline == '\n' or '\r\n': 
      if mainline == '\n' or '\r\n': 
       print "Would drop" 
    lastline = mainline 
    pointer = pointer + 1 

每一個時間它會通過for循環會打印出「會下降」,當字符串肯定不是任何這些四個選項。我想我正在做一些完全倒退的事情,但我正在給自己教python,所以當我遇到錯誤的時候,我沒有任何人告訴我。感謝上帝,你們在這裏。任何想法爲什麼發生這種情況?

感謝您的所有幫助,它的工作非常完美。謝謝!!!

+0

下面的答案已經解決了代碼中的錯誤。但重要的是要注意,您不必爲不同的行結尾明確編碼。請參閱http://www.python.org/dev/peps/pep-0278/。 – 2012-03-09 22:33:32

回答

6
lastline == '\n' or '\r\n' 

相同

(lastline == '\n') or ('\r\n') 
(lastline == '\n') or bool('\r\n') 
(lastline == '\n') or True 
True 

你想要麼

if lastline in ('\n', '\r\n'): 

if lastline == '\n' or lastline == '\r\n': 
+2

無法編輯,但是,如果lastline =='\ n'或...'而不是'if if lastline in =='\ n''在最後一個例子中,不能編輯嗎? – 2012-03-09 22:32:08

3

lastline == '\n' or '\r\n'相同(lastline == '\n') or '\r\n'(這始終是真的),lastline == '\n' or lastline == '\r\n'

您需要lastline in ('\n', '\r\n')而不是(類似於第二個)。

4

實際上,你需要:

if mainline == '\n' or mainline == '\r\n' 

沒有這種改變,你的代碼目前正在詢問問:

is mainline == '\n' True? 
or 
is '\r\n' True? 

而且,由於非空字符串評估到True,回答第二個問題是總是是的。

1

您使用的是or錯誤。 你應該寫

if lastline == '\n' or lastline == 'r\n': 
.... 

否則如果總是正確的。

1

note:請參閱其他解答以解決代碼中的錯誤。這個答案是關於換行符的。

Python有universal newline support,這樣你就不必擔心行尾:

fnames = ['a.txt','b.txt'] 
endings = ['\n', '\r\n'] 
for fname, ending in zip(fnames, endings): 
    with open(fname, 'wb') as f_out: # explicitly 'wb' for binary 
     f_out.write('a%sb%s' % (ending, ending)) 


for mode in ('rb', 'r'): 
    print 'mode:', mode 
    for fname in fnames: 
     with open(fname, mode) as f_in: 
      print "%s contains : %s" % (fname, repr(f_in.read())) 
    print 

mode: rb 
a.txt contains : 'a\nb\n' 
b.txt contains : 'a\r\nb\r\n' 

mode: r 
a.txt contains : 'a\nb\n' 
b.txt contains : 'a\nb\n' 

這裏的教訓是,如果你不以二進制打開文件模式,你不必擔心行結束。

相關問題