2010-06-15 52 views
13

Ho bisogno di confrontare due file e reindirizzare le diverse linee al terzo file. So che usando il comando diff posso ottenere la differenza. Ma c'è un modo per farlo in Python? Ogni codice di esempio sarà utileConfronto di due file di testo in python

risposta

-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

Indipendentemente dal fatto che questo codice funzioni, in realtà non spiega come fare w chiede la domanda. – 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

Perché il downvote? Forse spieghi il tuo codice Rekha? –

2

confronto tra due file di testo in Python?

Certo, difflib lo rende facile.

impostiamo 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) 

Ora per ispezionare un diff. Le linee che utilizzano os e time sono semplicemente utilizzati per fornire un timestamp decente per l'ultima volta i file sono stati modificati e sono completamente opzionali, e sono argomenti opzionali a difflib.unified_diff:

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

Ora dobbiamo solo aprire i file, e passare un elenco di loro linee (da f.readlines) per difflib.unified_diff, e unire l'uscita lista con una stringa vuota, stampa dei risultati:

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 
     ))) 

che stampa:

--- 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 

Anche in questo caso, è possibile rimuovere tutte le righe dichiarate facoltative/non necessarie e ottenere gli stessi risultati senza il timestamp.

reindirizzare le diverse linee per un terzo file

invece di stampare, aprire un terzo file di scrivere le linee:

 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) 

e:

$ 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