Comparando dos archivos de texto en python

Necesito comparar dos archivos y redirigir las diferentes líneas al tercer archivo. Sé que usando el comando diff puedo obtener la diferencia. Pero, ¿hay alguna manera de hacerlo en python? Cualquier código de ejemplo será útil

echa un vistazo a difflib

Este módulo proporciona clases y funciones para comparar secuencias. Puede utilizarse, por ejemplo, para comparar archivos y puede producir información de diferencias en varios formatos, incluidos HTML y contexto y diferencias unificadas […]

Un ejemplo de línea de comandos en http://docs.python.org/library/difflib.html#difflib-interface

#compare 2 text files. test1filehandle = open("test1.txt", "r") #creating a file handle test2filehandle=open("test2.txt","r") #creating a file handle to read test3filehandle=open("test3.txt","w") #creating a file handle to write test1list= test1filehandle.readlines() #read the lines and store in the list test2list=test2filehandle.readlines() k=1 for i,j in zip(test1list,test2list): #zip is used to iterate the variablea in 2 lists simultaneoously if i !=j: test3filehandle.write("Line Number:" +str(k)+' ') test3filehandle.write(i.rstrip("\n") + ' '+ j) k=int(k) k=k+1; 

¿Comparando dos archivos de texto en python?

Claro, difflib lo hace fácil.

Vamos a configurar una demostración:

 f1path = 'file1' f2path = 'file2' text1 = '\n'.join(['a', 'b', 'c', 'd', '']) text2 = '\n'.join(['a', 'ba', 'bb', 'c', 'def', '']) for path, text in ((f1path, text1), (f2path, text2)): with open(path, 'w') as f: f.write(text) 

Ahora para inspeccionar un diff. Las líneas que usan os y time se usan simplemente para proporcionar una marca de tiempo decente la última vez que se modificaron sus archivos, son completamente opcionales y son argumentos opcionales para difflib.unified_diff :

 # optional imports: import os import time # necessary import: import difflib 

Ahora simplemente abrimos los archivos y pasamos una lista de sus líneas (de f.readlines ) a difflib.unified_diff , y unimos la salida de la lista con una cadena vacía, imprimiendo los resultados:

 with open(f1path, 'rU') as f1: with open(f2path, 'rU') as f2: readable_last_modified_time1 = time.ctime(os.path.getmtime(f1path)) # not required readable_last_modified_time2 = time.ctime(os.path.getmtime(f2path)) # not required print(''.join(difflib.unified_diff( f1.readlines(), f2.readlines(), fromfile=f1path, tofile=f2path, fromfiledate=readable_last_modified_time1, # not required tofiledate=readable_last_modified_time2, # not required ))) 

que imprime:

 --- file1 Mon Jul 27 08:38:02 2015 +++ file2 Mon Jul 27 08:38:02 2015 @@ -1,4 +1,5 @@ a -b +ba +bb c -d +def 

Nuevamente, puede eliminar todas las líneas que se declaran opcionales / no requeridas y obtener los mismos resultados sin la marca de tiempo.

redirigir las diferentes líneas a un tercer archivo

En lugar de imprimir, abra un tercer archivo para escribir las líneas:

  difftext = ''.join(difflib.unified_diff( f1.readlines(), f2.readlines(), fromfile=f1path, tofile=f2path, fromfiledate=readable_last_modified_time1, # not required tofiledate=readable_last_modified_time2, # not required )) with open('diffon1and2', 'w') as diff_file: diff_file.write(difftext) 

y:

 $ cat diffon1and2 --- file1 Mon Jul 27 11:38:02 2015 +++ file2 Mon Jul 27 11:38:02 2015 @@ -1,4 +1,5 @@ a -b +ba +bb c -d +def 
 import sys if len(sys.argv) !=3 : print "usage:" + sys.argv[0] + " bla bla" exit elif len(sys.argv) == 3: file1 = set((x for x in open(sys.argv[1]))) file2 = set((x for x in open(sys.argv[2]))) file3 = file2.difference(file1) file4 = file1.difference(file2) str1="file1-contains but file2 not \n" str2="file2-contains but file1 not\n" FILE = open('file3','w') FILE.writelines(str2) FILE.writelines(file3) FILE.writelines(str1) FILE.writelines(file4)