2012-03-09 100 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' 

这里的教训是,如果你不以二进制打开文件模式,你不必担心行结束。

相关问题