Compara dos archivos diferentes línea por línea en Python

Tengo dos archivos diferentes y quiero comparar sus contenidos línea por línea y escribir sus contenidos comunes en un archivo diferente. Tenga en cuenta que ambos contienen algunos espacios en blanco. Aquí está mi pseudo código:

file1 = open('some_file_1.txt', 'r') file2 = open('some_file_2.txt', 'r') FO = open('some_output_file.txt', 'w') for line1 in file1: for line2 in file2: if line1 == line2: FO.write("%s\n" %(line1)) FO.close() file1.close() file2.close() 

Sin embargo, al hacer esto, tengo muchos espacios en blanco en mi archivo FO . Parece que los espacios en blanco comunes también se escriben. Quiero escribir sólo la parte de texto. Alguien por favor me puede ayudar.

Por ejemplo: mi primer archivo (archivo1) contiene datos:

 Config: Hostname = TUVALU BT: TS_Ball_Update_Threshold = 0.2 BT: TS_Player_Search_Radius = 4 BT: Ball_Template_Update = 0 

mientras que el segundo archivo (archivo2) contiene datos:

 Pole_ID = 2 Width = 1280 Height = 1024 Color_Mode = 0 Sensor_Scale = 1 Tracking_ROI_Size = 4 Ball_Template_Update = 0 

Si se da cuenta, las dos últimas líneas de cada archivo son iguales, por lo tanto, quiero escribir este archivo en mi archivo FO . Pero, el problema con mi enfoque es que, también escribe el espacio en blanco común. ¿Debo usar expresiones regulares para este problema? No tengo experiencia con expresiones regulares.

Esta solución lee ambos archivos en una sola pasada, excluye las líneas en blanco e imprime las líneas comunes sin importar su posición en el archivo:

 with open('some_file_1.txt', 'r') as file1: with open('some_file_2.txt', 'r') as file2: same = set(file1).intersection(file2) same.discard('\n') with open('some_output_file.txt', 'w') as file_out: for line in same: file_out.write(line) 

Otro ejemplo más …

 from __future__ import print_function #Only for Python2 with open('file1.txt') as f1, open('file2.txt') as f2, open('outfile.txt', 'w') as outfile: for line1, line2 in zip(f1, f2): if line1 == line2: print(line1, end='', file=outfile) 

Y si desea eliminar las líneas en blanco comunes, simplemente cambie la instrucción if a:

if line1.strip() and line1 == line2:

.strip() elimina todos los espacios en blanco .strip() y finales, así que si eso es todo lo que está en una línea, se convertirá en una cadena vacía "" , que se considera falsa.

Una vez que el objeto de archivo se itera, se agota.

 >>> f = open('1.txt', 'w') >>> f.write('1\n2\n3\n') >>> f.close() >>> f = open('1.txt', 'r') >>> for line in f: print line ... 1 2 3 # exausted, another iteration does not produce anything. >>> for line in f: print line ... >>> 

Use file.seek (o cierre / abra el archivo) para rebobinar el archivo:

 >>> f.seek(0) >>> for line in f: print line ... 1 2 3 

Si el orden se conserva entre los archivos, también puede preferir difflib . Aunque el resultado de Robᵩ es el estándar de buena fe para las intersecciones, en realidad podría estar buscando una diferencia aproximada:

 from difflib import Differ with open('cfg1.txt') as f1, open('cfg2.txt') as f2: differ = Differ() for line in differ.compare(f1.readlines(), f2.readlines()): if line.startswith(" "): print(line[2:], end="") 

Dicho esto, esto tiene un comportamiento diferente al que solicitó (el orden es importante) aunque en este caso se produzca la misma salida.

Si está buscando específicamente obtener la diferencia entre dos archivos, entonces esto podría ayudar:

 with open('first_file', 'r') as file1: with open('second_file, 'r') as file2: difference = set(file1).difference(file2) #We can use intersection() method instead of difference() if we need to print the common items difference.discard('\n') with open('diff.txt', 'w') as file_out: for line in difference: file_out.write(line) 

Acabo de enfrentar el mismo desafío, pero pensé “¿Por qué progtwigr esto en Python si puedes resolverlo con un simple” grep “?, lo que llevó al siguiente código de Python:

 import subprocess from subprocess import PIPE try: output1, errors1 = subprocess.Popen(["c:\\cygwin\\bin\\grep", "-Fvf" ,"c:\\file1.txt", "c:\\file2.txt"], shell=True, stdout=PIPE, stderr=PIPE).communicate(); output2, errors2 = subprocess.Popen(["c:\\cygwin\\bin\\grep", "-Fvf" ,"c:\\file2.txt", "c:\\file1.txt"], shell=True, stdout=PIPE, stderr=PIPE).communicate(); if (len(output1) + len(output2) + len(errors1) + len(errors2) > 0): print ("Compare result : There are differences:"); if (len(output1) + len(output2) > 0): print (" Output differences : "); print (output1); print (output2); if (len(errors1) + len(errors2) > 0): print (" Errors : "); print (errors1); print (errors2); else: print ("Compare result : Both files are equal"); except Exception as ex: print("Compare result : Exception during comparison"); print(ex); raise; 

El truco detrás de esto es el siguiente: grep -Fvf file1.txt file2.txt verifica si todas las entradas en file2.txt están presentes en file1.txt. Al hacer esto en ambas direcciones, podemos ver si el contenido de ambos archivos es “igual”. Pongo “igual” entre comillas porque las líneas duplicadas no se tienen en cuenta en esta forma de trabajar.

Obviamente, esto es solo un ejemplo: puede reemplazar grep por cualquier herramienta de comparación de archivos de la línea de comandos.

Prueba esto:

 from __future__ import with_statement filename1 = "G:\\test1.TXT" filename2 = "G:\\test2.TXT" with open(filename1) as f1: with open(filename2) as f2: file1list = f1.read().splitlines() file2list = f2.read().splitlines() list1length = len(file1list) list2length = len(file2list) if list1length == list2length: for index in range(len(file1list)): if file1list[index] == file2list[index]: print file1list[index] + "==" + file2list[index] else: print file1list[index] + "!=" + file2list[index]+" Not-Equel" else: print "difference inthe size of the file and number of lines"