Python:在if语句中使用'或'会导致代码执行,即使条件不满足也是如此

时间:2012-03-09 22:21:52

标签: python if-statement

我正在编写一个解析器,其中两条线被比较在一起(可以说是'mainline'和它之前的线)。如果这两条线都匹配,则主线被丢弃。我只希望这发生在仅包含换行符或回车换行符的行上。所以我有这个代码

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,所以当我出错时,我真的没有人告诉我。感谢上帝,你们都在这里。任何想法为什么会发生这种情况?

感谢您的所有帮助,这是完美的。感谢!!!

5 个答案:

答案 0 :(得分: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':

答案 1 :(得分:4)

你真的需要:

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

如果没有这种更改,您的代码目前正在询问:

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

由于非空白字符串的评估结果为True,因此第二个问题的答案始终为是。

答案 2 :(得分:3)

lastline == '\n' or '\r\n'(lastline == '\n') or '\r\n'相同(始终为真), lastline == '\n' or lastline == '\r\n'

您需要lastline in ('\n', '\r\n')(类似于第二个)。

答案 3 :(得分:1)

您正在使用or错误。 你应该写

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

否则if总是如此。

答案 4 :(得分:1)

注意:请参阅其他答案以解决代码中的错误。这个答案是关于换行的。

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'

这里的教训是,如果您不以二进制模式打开文件,则无需担心行结尾。