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