Разные строки между двумя файлами, когда одна строка содержит конечные пробелы (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
>>>
Надеюсь это поможет!