Найдите различия между файлами, не проверяя построчно. Python

#python #python-3.x #file #string-comparison #difflib

#python #python-3.x #файл #сравнение строк #difflib

Вопрос:

Я пытаюсь проверить различия между двумя выходными файлами, которые содержат смесь IP-адресов и подсетей. Они удаляются из файла и сохраняются на output1.txt и output2.txt . Я испытываю трудности при выполнении сравнения. Эти файлы не всегда имеют одинаковое количество строк, поэтому сравнение построчно не представляется возможным. Например, оба файла могут иметь IP-адрес 192.168.1.1, но в output1.txt это может быть в строке 1 и в output2.txt это может быть на линии 60. Как мне правильно сравнить, определяя, какие строки отсутствуют в обоих файлах?

Код ниже

 import difflib


with open('input1.txt','r') as f:
    with open('output1.txt', 'w') as g:
        for line in f:
            ipaddress = line.split(None, 1)[0]
            g.write(ipaddress   "n")
with open('input2.txt', 'r') as f:
    with open('output2.txt', 'w') as g:
        for line in f:
            ipaddress = line.split(None, 1)[0]
            g.write(ipaddress   "n")

with open('output1.txt', 'r') as output1, open('output2.txt', 'r') as output2:
    output1_text = output1.read()
    output2_text = output2.read()
    d = difflib.Differ()
    diff = d.compare(output1_text, output2_text)
    print(''.join(diff))
  

В конечном итоге я захочу, чтобы различия были записаны в файл, но пока достаточно просто распечатать результат.

Ценю помощь.

Спасибо.

Комментарии:

1. Начните с сортировки обоих списков. Затем вы можете пошагово просмотреть оба файла построчно. Если они равны, сделайте шаг вниз по строке в обоих файлах. Если значение из ввода 1 меньше, запишите его в список различий и сделайте шаг вниз по строке. Если значение из ввода 2 меньше, запишите его в список и сделайте шаг вниз по строке в этом файле.

2. Вы можете отсортировать IP-адреса, что упрощает сравнение. Вы могли бы создать набор из них и выполнить некоторые операции с набором, или…

Ответ №1:

Вероятно, вам нужно сравнение наборов:

 with open('output1.txt') as fh1, open('output2.txt') as fh2:
    # collect lines into sets
    set1, set2 = set(fh1), set(fh2)
    
diff = set1.symmetric_difference(set2)

print(''.join(diff))
  

Где symmetric_difference будет:

Возвращает новый набор с элементами либо в наборе, либо в другом, но не в обоих.

Комментарии:

1. блестяще, спасибо! Это именно то, что я искал!!