Python: использование «или» в операторе if приводит к выполнению кода, даже если условия не были выполнены - PullRequest
0 голосов
/ 10 марта 2012

Я нахожусь в процессе написания парсера, в котором две строки сравниваются друг с другом (так сказать, «основная линия» и строка, предшествующая ей). Если обе эти строки совпадают, основная линия отбрасывается. Я хочу, чтобы это происходило только в строках, состоящих только из новых строк или переносимых строк. Итак, у меня есть этот код

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, он будет печатать «Будет сброшено», когда строка, безусловно, не является ни одной из этих четырех опций. Я полагаю, что я делаю что-то полностью задом наперед, но я преподаю питон для себя, поэтому у меня нет никого, кто мог бы сказать мне, когда я собираюсь что-то не так. Слава богу, что вы, ребята, здесь. Есть идеи, почему это происходит?

Благодаря вашей помощи он работает отлично. Спасибо !!!

Ответы [ 5 ]

6 голосов
/ 10 марта 2012
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':
4 голосов
/ 10 марта 2012

Вам действительно нужно:

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

Без этого изменения ваш код сейчас спрашивает:

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

И поскольку непустые строки оцениваются как True, ответ на второй вопрос всегда - да.

3 голосов
/ 10 марта 2012

lastline == '\n' or '\r\n' совпадает с (lastline == '\n') or '\r\n' (что всегда верно), не lastline == '\n' or lastline == '\r\n'.

Вместо этого вы хотите lastline in ('\n', '\r\n') (аналогично для второго).

1 голос
/ 10 марта 2012

Примечание: См. Другие ответы для устранения ошибок в вашем коде.Этот ответ о переводах строки.

Python имеет универсальную поддержку перевода строки , поэтому вам не нужно беспокоиться об окончаниях строк:

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'

Урок здесь заключается в том, что если вы не открываете свои файлы в двоичном режиме, вам не нужно беспокоиться об окончании строки.

1 голос
/ 10 марта 2012

вы используете or неправильно.вы должны написать

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

в противном случае, если всегда верно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...