Python ‘==’ devolviendo incorrectamente false

Estoy tratando de obtener una diferencia de dos archivos línea por línea, y Python siempre devuelve falso; incluso cuando hago una diferencia de los mismos archivos, Python (casi) siempre devuelve falso. Ejemplo ridículo, pero reproduce mi problema en Python 3.4.3.

file1.txt (example) 1 2 3 file1 = r"pathtofile\file1.txt" file2 = r"pathtofile\file1.txt" f1 = open(file1, "r") f2 = open(file2, "r") for line1 in f1: found = False for line2 in f2: if repr(line1) == repr(line2): found = True print("true") if found == False: print("false") 

Python identifica correctamente que la primera línea es la misma, pero todo lo que sigue es falso. ¿Alguien más puede replicar esto? ¿Algunas ideas?

Ha agotado el iterador después de la primera iteración sobre f2 , necesita file.seek(0) para volver al inicio del archivo.

 for line1 in f1: found = False for line2 in f2: if repr(line1) == repr(line2): print("true") f2.seek(0) # reset pointer to start of file 

Solo verifica la primera línea de f1 contra las líneas de f2 , después del primer bucle no hay nada sobre lo que iterar.

Dependiendo de lo que quiera que ocurra, debe break cuando encuentre la línea que coincida o, si no, restablecer el valor found = False en el bucle interno.

Si desea que todas las líneas coincidan, simplemente almacene la salida en una lista o si los archivos no son muy grandes, puede usar conjuntos para encontrar líneas comunes.

 with open("f1") as f1, open("f2") as f2: st = set(f1) common = st.intersection(f2) 

Si desea la diferencia, use st.difference(f2) , para las líneas en ambos, no en st.symmetric_difference(f2) . Todo depende de lo que realmente quieras hacer.

Es posible que también desee revisar filecmp y difflib

Cuando Python lee un archivo, en realidad se mueve a través del archivo como un cursor. Una vez que llega al final, ya no tiene ningún texto para leer. Sería mejor leer todo f2 de una sola vez la función de readlines de lectura. Eso leerá todo el archivo y lo almacenará como una lista donde cada línea es un elemento de la lista. Entonces puedes recorrerlo tantas veces como quieras.

 file1 = r"pathtofile\file1.txt" file2 = r"pathtofile\file1.txt" f1 = open(file1, "r") f2 = open(file2, "r").readlines() for line1 in f1: found = False for line2 in f2: if repr(line1) == repr(line2): print("true") if found == False: print("false") 

Además de las otras respuestas, si solo quiere saber si los archivos son iguales o no, lógicamente sería mejor comparar los archivos línea por línea, en lugar de comparar la primera línea del primer archivo con todas las líneas. del segundo archivo, luego comparando la segunda línea del primer archivo con todas las líneas del segundo archivo, etc.

Para este ejemplo es posible usar la cláusula for-else :

 for line1, line2 in zip(f1, f2): if line1 != line2: print ("false") break # found 2 different lines in the same place so the files can't be equal else: print ("true")