Python: usar 'o' en una declaración if hace que el código se ejecute incluso si no se cumplen las condiciones

Estoy en el proceso de escribir un analizador en el que se comparan dos líneas juntas (la 'línea principal', por así decirlo, y la línea anterior). Si ambas líneas coinciden, la línea principal se descarta. Solo quiero que esto suceda en líneas que consisten solo en líneas nuevas o líneas nuevas de retorno de carro. entonces tengo este codigo

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

Cada vez que pasa por ese bucle for, imprimirá "Se caería", cuando la cadena ciertamente no es ninguna de esas cuatro opciones. Me imagino que estoy haciendo algo completamente al revés, pero me estoy enseñando Python a mí mismo, así que realmente no tengo a nadie que me diga cuando estoy haciendo algo mal. Gracias a Dios que ustedes están aquí. ¿Alguna idea de por qué sucede esto?

Gracias a toda su ayuda está funcionando perfecto. ¡¡¡Gracias!!!

preguntado el 09 de marzo de 12 a las 22:03

Las respuestas a continuación han abordado los errores en su código. Pero es importante tener en cuenta que no tiene que codificar explícitamente para diferentes finales de línea. Ver python.org/dev/peps/pep-0278. -

5 Respuestas

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

es el mismo que

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

Tu quieres

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

or

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

respondido 09 mar '12, 22:03

No puedo editar, pero no querrás decir if lastline == '\n' or... en lugar de if lastline in == '\n' en ese último ejemplo? - joel cornett

En realidad necesitas:

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

Sin ese cambio, su código actualmente está preguntando:

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

Y dado que las cadenas que no están en blanco se evalúan como True, la respuesta a la segunda pregunta siempre es sí.

respondido 09 mar '12, 22:03

lastline == '\n' or '\r\n' es el mismo que (lastline == '\n') or '\r\n' (que siempre es cierto), no lastline == '\n' or lastline == '\r\n'.

¿Quieres lastline in ('\n', '\r\n') en su lugar (de manera similar para el segundo).

respondido 09 mar '12, 22:03

estás usando el or incorrecto. Deberías escribir

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

de lo contrario, el si siempre es verdadero.

respondido 09 mar '12, 22:03

Nota: Vea las otras respuestas para abordar los errores en su código. Esta respuesta es sobre nuevas líneas.

Python tiene soporte universal de nueva línea para que no tengas que preocuparte por los finales de línea:

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

da

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'

La lección aquí es que si no abre sus archivos en modo binario, no necesita preocuparse por los finales de línea.

respondido 09 mar '12, 22:03

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.