2010-06-15 91 views
13

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 forma de hacerlo en Python? Cualquier código de ejemplo será útil chequeComparación de dos archivos de texto en python

Respuesta

16

cabo difflib

Este módulo proporciona clases y funciones para la comparación de secuencias. Se se puede utilizar, por ejemplo, para comparar archivos, y puede producir diferencia información en varios formatos, incluyendo HTML y contexto y unificados diff [...]

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

-3
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) 
+2

Independientemente de si este código funciona, realmente no explica cómo hacer w que pregunta la pregunta – yoozer8

4
#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; 
+1

¿Por qué el voto a favor? Tal vez explicar tu código Rekha? –

2

La comparación de dos archivos de texto en Python?

Sure, difflib lo hace fácil.

vamos a configurar una demo:

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 utilizan os y time se utiliza simplemente para proporcionar un sello de tiempo decente para la última vez que se modificaron sus archivos, y son completamente opcionales, y son argumentos opcionales a difflib.unified_diff:

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

Ahora sólo abrir los archivos, y pasar una lista de sus líneas (de f.readlines) a difflib.unified_diff, y unirse a la lista de salida con una cadena vacía, la impresión de 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 son declaradas opcionales/no obligatorias y obtener los mismos resultados sin la marca de tiempo.

redirigir las diferentes líneas a un tercer archivo

en lugar de imprimir, abrir 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 
Cuestiones relacionadas