import difflib diff = difflib.Differ(linejunk=None, charjunk=None) rez = diff.compare(a, b)
linejunk=None
- функция фильтрации символов строк,charjunk=None
- функция фильтрации символов символов,a
, b
- списки строк.Класс Differ()
модуля difflib
сравнивает списки строк a
и b
и возвращает список строк с указанием различий в строках как генератор строк понятных человеку.
linejunk
: функция, которая принимает один строковый аргумент и возвращает True
, если строка является мусором. По умолчанию linejunk=None
, это означает, что ни одна строка не считается мусором.
charjunk
: функция, которая принимает символ - строка длиной 1 символ и возвращает True
, если символ является мусором. По умолчанию charjunk=None
, это означает, что ни один символ не считается мусором.
Эти функции фильтрации мусора ускоряют сопоставление для поиска различий.
Каждая строка класса Differ()
дельты начинается с двухбуквенного кода:
'- '
- строка, уникальная для последовательности 1'+ '
- строка, уникальная для последовательности 2' '
- линия, общая для обеих последовательностей'? '
- строка не присутствует ни в одной из входных последовательностейСтроки, начинающиеся с '? '
, пытаются направить взгляд на внутрипочвенные различия и не присутствуют ни в одной из входных последовательностей. Эти строки могут сбивать с толку, если последовательности содержат символы табуляции.
Класс Differ()
имеет один метод, который и генерирует различия:
compare(a, b)
:Метод compare(a, b)
сравнивает два списка строк и генерирует дельту (последовательность строк).
Каждая последовательность должна содержать отдельные строки, заканчивающиеся символами новой строки '\n'
. Такие последовательности могут быть получены методом файловых объектов file.readlines()
. Сгенерированная дельта также состоит из строк, оканчивающихся символом новой строки, готовых к печати как есть через метод файлового объекта file.writelines()
.
Этот пример сравнивает два текста. Сначала определим тексты как список отдельных строк, заканчивающиеся символами новой строки.
txt1 = ''' 1. Beautiful is better than ugly. 2. Explicit is better than implicit. 3. Simple is better than complex. 4. Complex is better than complicated. ''' txt2 = ''' 1. Beautiful is better than ugly. 3. Simple is better than complex. 4. Complicated is better than complex. 5. Flat is better than nested. ''' text1 = txt1.splitlines(keepends=True) text1 = txt2.splitlines(keepends=True)
Создадим экземпляр объекта Differ
:
import difflib as df d = df.Differ()
Обратите внимание, что при создании объекта Differ()
можно передать функции для фильтрации строк и символов "мусора". Теперь сравним два:
result = list(d.compare(text1, text2))
result
это список строк, напечатаем его:
from pprint import pprint as prt prt(result) # [' 1. Beautiful is better than ugly.\n', # '- 2. Explicit is better than implicit.\n', # '- 3. Simple is better than complex.\n', # '+ 3. Simple is better than complex.\n', # '? ++\n', # '- 4. Complex is better than complicated.\n', # '? ^ ---- ^\n', # '+ 4. Complicated is better than complex.\n', # '? ++++ ^ ^\n', # '+ 5. Flat is better than nested.\n']
Как одна многострочная строка это выглядит так:
import sys sys.stdout.writelines(result) # 1. Beautiful is better than ugly. # - 2. Explicit is better than implicit. # - 3. Simple is better than complex. # + 3. Simple is better than complex. # ? ++ # - 4. Complex is better than complicated. # ? ^ ---- ^ # + 4. Complicated is better than complex. # ? ++++ ^ ^ # + 5. Flat is better than nested.