Сообщить об ошибке.

Класс Differ() модуля difflib в Python

Получить различий двух текстов понятных человеку

Синтаксис:

import difflib

diff = difflib.Differ(linejunk=None, charjunk=None)
rez = diff.compare(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.