Сравнение двух текстовых файлов в python

Мне нужно сравнить два файла и перенаправить разные строки в третий файл. Я знаю, используя команду diff, я могу получить разницу. Но есть ли способ сделать это в python? Любой пример кода будет полезен

Ответы

Ответ 1

проверить difflib

Этот модуль предоставляет классы и функции для сравнения последовательностей. Это может использоваться, например, для сравнения файлов, и может привести к разнице информация в различных форматах, включая HTML и контекст и унифицированные дифференциалы [...]

Пример командной строки в http://docs.python.org/library/difflib.html#difflib-interface

Ответ 2

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

Ответ 3

Сравнение двух текстовых файлов в python?

Конечно, difflib упрощает работу.

Пусть настроено демо:

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)

Теперь, чтобы проверить diff. Линии, использующие os и time, просто используются для обеспечения достойной отметки времени в последний раз, когда ваши файлы были изменены и являются полностью необязательными, и являются необязательными аргументами для difflib.unified_diff:

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

Теперь мы просто открываем файлы и передаем список их строк (от f.readlines) до difflib.unified_diff и присоединяем вывод списка с пустой строкой, печатая результаты:

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

который печатает:

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

Опять же, вы можете удалить все строки, объявленные как необязательные/не требуемые, и получить аналогичные результаты без метки времени.

перенаправить разные строки в третий файл

вместо печати откройте третий файл для записи строк:

        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)

и

$ 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

Ответ 4

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)