Разные строки между двумя файлами, когда одна строка содержит конечные пробелы (Python, difflib)

Я хочу сравнить два текстовых файла в Python и вернуть строки, которые отличаются. Моя попытка использует difflib, но я открыт для других предложений. Мне нужно получить строки, которые отличаются, а также строки, которые появляются в одном файле, но не в другом. Порядок несколько важен, но если существует хорошее решение, которое не принимает во внимание порядок, я могу отпустить это.

Проблема в том, что в одном файле есть строки, которые имеют несколько завершающих символов \t а также \nа другой нет; Я не хочу рассматривать это как разницу. Для других файлов первый файл имеет только \n а другие файлы \t символы в конце. Строки содержат элементы, разделенные табуляцией или пробелами, поэтому они важны; Мне просто плевать на висячих персонажей \t а также \n,

Мое решение:

from difflib import Differ

with open(file_path) as actual:
    with open(test_file_path) as test:
        differ = Differ()

        for line in differ.compare(actual.readlines(), test.readlines()):
            if line.startswith('-'):
                log.error('EXPECTED:  {}'.format(line[2:]))
            if line.startswith('+'):
                log.error('TEST FILE: {}'.format(line[2:]))

Я ожидаю, что выходные данные покажут строки EXPECTED и TEST FILE, когда есть разница, и просто EXPECTED или просто TEST FILE, если одна содержит строку, а другая - нет. Прямо сейчас я вижу много следующих типов ошибок:

00:02:40: ERROR EXPECTED:  Issuer   Type    OBal    Net WAC OTerm   WAM Age GrossCpn    HighRemTerm Grp                                     

00:02:40: ERROR TEST FILE: Issuer   Type    OBal    Net WAC OTerm   WAM Age GrossCpn    HighRemTerm Grp

Как вы можете видеть (если вы выделите его), первая строка содержит количество пробелов после 'Grp', а другая строка - нет. Я хочу считать эти две строки одинаковыми.

Я пытался явно указать вкладки и разрывы строк:

actual_file = actual.readlines()
expected_file = []
for line in actual_file:
    if line[-1] == '\n':
        expected_file.append(line.rstrip('\n').rstrip('\t') + '\n')
    else:
        expected_file.append(line.rstrip('\t'))

Тем не менее, он (а) значительно замедляет процесс, и (б) требуется для каждого типа файлов по-разному, так как некоторые файлы имеют конечные вкладки, за которыми следуют разрывы строк, некоторые имеют просто разрывы строк, а некоторые ничего не имеют совсем. Если нет лучшего способа, я могу обрезать каждую строку каждой конечной вкладки и переноса строки, но кажется, что требуется много вычислительной мощности (мне нужно запустить много файлов) для чего-то, что кажется довольно простым для решения.

1 ответ

Взгляни на string.rstrip() здесь: https://docs.python.org/2/library/string.html

string.rstrip() должен делать именно то, что вам нужно, удаляя пробелы в конце строки, оставляя символы \t и \n перед концом.

Проверьте это:

>>> import string
>>> s = "This \t is \t a \t line \t\t\t\n\n\n"
>>> print(s)
This     is      a   line



>>>
>>> s = string.rstrip(s)
>>> s
'This \t is \t a \t line'
>>> print(s)
This     is      a   line
>>>

Надеюсь это поможет!

Другие вопросы по тегам