#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. блестяще, спасибо! Это именно то, что я искал!!