2009-06-10 46 views
18

Sto provando a confrontare due file di testo e restituisco la prima stringa nel file di confronto che non corrisponde ma ho difficoltà visto che sono molto nuovo in Python. Qualcuno può per favore darmi un modo per usare questo modulo.Confronto tra due file .txt utilizzando difflib in Python

quando provo qualcosa di simile:

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

ottengo un errore che dice oggetto di 'file' tipo non ha len.

risposta

27

per cominciare, è necessario passare le stringhe di difflib.SequenceMatcher, non i file:

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

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

che sarà risolvere il tuo errore comunque. Per ottenere la prima stringa non corrispondente, ti indirizzerò al meraviglioso mondo di difflib documentation.

+12

@OP: Oltre ai documenti, date un'occhiata all'eccezionale voce difflib del modulo Python di Doug Hellmann: http://blog.doughellmann.com/2007/10/pymotw- difflib.html – bernie

+0

@Adam - grazie per il collegamento - lo verificherò – Triptych

+0

@bernie Quel collegamento è morto. Hai un indirizzo aggiornato? – BlackVegetable

5

Sei sicuro che entrambi i file esistano?

Appena testato e ottengo un risultato perfetto.

per ottenere i risultati che ho usare qualcosa come:

import difflib 

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

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

il primo carattere di ogni riga indica se sono diversi: ad esempio .: '+' significa che è stata aggiunta la seguente riga, ecc

+0

oops, sei giusto errore stupido. Ma non sono ancora sicuro di come ottenere i dati che mi servono dai risultati. Come faccio a sapere se si differenziano o no? Come posso ottenere la prima stringa che differisce? Ci scusiamo un sacco di domande :( – VeePee

3

Sembra che tu non abbia bisogno di difflib. Se si sta confrontando linea per linea, provare qualcosa di simile:

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

non hai bisogno di readlines, zip può fare anche con i gestori di file – SilentGhost

+0

non si interromperà se i file hanno la stessa quantità di righe ma contenuto diverso? – VeePee

+0

funzionerà se le linee non sono ordinate? – Illusionist

6

Ecco un rapido esempio di confronto tra il contenuto di due file utilizzando Python difflib ...

import difflib 

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

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

Come potremmo evitare di visualizzare linee uguali? Voglio solo le linee che differiscono da stampare –

+1

@OlivierCervello import difflib, sys con aperto ("a") come: a_content = a.readlines() con aperto ("b") come b: b_content = b.readlines() diff = difflib.unified_diff (a_content, b_content) print ("***** Unified diff ************") print ("Line no" + '\ t' + 'file1' + '\ t' + 'file2') per i, riga in enumerate (diff): se line.startswith ("-"): stampa (i, '\ t \ t' + linea) elif line.startswith ("+"): stampa (io, '\ t \ t \ t \ t \ t \ t' + linea) ' – kishorebjv

Problemi correlati