2009-06-10 157 views
18

Estoy tratando de comparar dos archivos de texto y generar la primera cadena en el archivo de comparación que no concuerda pero estoy teniendo dificultades ya que soy muy nuevo en Python. ¿Puede alguien darme una forma de muestra para usar este módulo?Comparando dos archivos .txt usando difflib en Python

cuando intento algo como:

result = difflib.SequenceMatcher(None, testFile, comparisonFile) 

me sale un error diciendo objeto de 'archivo' de tipo no tiene len.

Respuesta

27

para empezar, tiene que pasar cadenas de difflib.SequenceMatcher, no los archivos:

# Like so 
difflib.SequenceMatcher(None, str1, str2) 

# Or just read the files in 
difflib.SequenceMatcher(None, file1.read(), file2.read()) 

Eso va a corregir su error de todos modos. Para obtener la primera cadena que no coincide, lo dirigiré al maravilloso mundo de difflib documentation.

+12

@OP: Además de los documentos, eche un vistazo a la excelente entrada difflib de módulo de Python de Doug Hellmann: http://blog.doughellmann.com/2007/10/pymotw- difflib.html – bernie

+0

@Adam - gracias por el enlace - Lo verificare – Triptych

+0

@bernie Ese enlace está muerto. ¿Tiene una dirección actualizada? – BlackVegetable

5

¿Estás seguro de que existen ambos archivos?

Acabo de probarlo y obtengo un resultado perfecto.

para obtener los resultados que usar algo como:

import difflib 

diff=difflib.ndiff(open(testFile).readlines(), open(comparisonFile).readlines()) 

try: 
    while 1: 
     print diff.next(), 
except: 
    pass 

el primer carácter de cada línea indica si son diferentes: por ejemplo .: '+' significa que la siguiente línea se ha añadido, etc.

+0

Vaya, eres correcto error tonto. Pero aún no estoy seguro de cómo obtener los datos que necesito del resultado. ¿Cómo puedo saber si difieren o no? ¿Cómo puedo obtener la primera cadena que difiere? Lo siento muchas preguntas :( – VeePee

3

Parece que no necesita difflib en absoluto. Si usted está comparando línea por línea, intentar algo como esto:

test_lines = open("test.txt").readlines() 
correct_lines = open("correct.txt").readlines() 

for test, correct in zip(test_lines, correct_lines): 
    if test != correct: 
     print "Oh no! Expected %r; got %r." % (correct, test) 
     break 
else: 
    len_diff = len(test_lines) - len(correct_lines) 
    if len_diff > 0: 
     print "Test file had too much data." 
    elif len_diff < 0: 
     print "Test file had too little data." 
    else: 
     print "Everything was correct!" 
+0

no necesita readlines allí, zip puede hacer con los manejadores de archivos también – SilentGhost

+0

¿no se romperá esto si los archivos tienen la misma cantidad de líneas pero diferente contenido? – VeePee

+0

¿funcionará esto si las líneas no están ordenadas? – Illusionist

6

Aquí está un ejemplo rápido de comparar el contenido de dos archivos usando Python difflib ...

import difflib 

file1 = "myFile1.txt" 
file2 = "myFile2.txt" 

diff = difflib.ndiff(open(file1).readlines(),open(file2).readlines()) 
print ''.join(diff), 
+2

Cómo ¿Podríamos evitar mostrar las líneas que son iguales? Solo quiero que las líneas que difieren se impriman. –

+1

@OlivierCervello import difflib, sys con abierto ("a") como: a_content = a.readlines() con abierto ("b") como b: b_content = b.readlines() diff = difflib.unified_diff (a_content, b_content) print ("***** Unified diff ************") print ("Línea no" + '\ t' + 'archivo1' + '\ t' + 'archivo2') para i, línea en enumerate (diff): if line.startswith ("-"): imprimir (i, '\ t \ t' + línea) elif line.startswith ("+"): imprimir (yo, '\ t \ t \ t \ t \ t \ t' + línea) ' – kishorebjv