Как пропустить новые строки для сравнения в python? - PullRequest
0 голосов
/ 08 января 2020

У меня есть python код, который сравнивает 2 текстовых файла и показывает, есть ли у них различия. сначала я сортирую файлы, затем удаляю их пробелы, которые находятся в конце текста после сортировки, затем выполняю сравнение.

#!/usr/bin/env python

import difflib
from pathlib import Path

path1=Path('/data1/Dir/thesaurus/file1')
path2=Path('/data1/Dir/thesaurus/file2')

text1 = open(str(path1)).readlines()
text1.sort(key=lambda x: x.strip('#').rsplit('.', 1)[0])
text2 = open(str(path2)).readlines()
text2.sort(key=lambda x: x.strip('#').rsplit('.', 1)[0])

for line in difflib.unified_diff(text1, text2, n=0):
print line,

на самом деле эти файлы для сравнения являются /etc/passwd разных серверов. этот код работал хорошо, но недавно я обнаружил, что он не возвращает правильный вывод для некоторых серверов из-за \n. как я могу устранить эти \n в моем сравнении?

например, file1 и file2 имеют это содержание:

@=> cat file1
wise:x:wuser:/home/wise:/sbin/nologin
nafs:x:user:/home/nafs:/sbin/nologin
khor:x:khor:/home/khor:/bin/bash
jari:x:user:/home/jari:/sbin/nologin
test:x:Test:/home/test:/sbin/nologin
zabbix:x:Zabbix Agent:/home/zabbix:/usr/sbin/nologin
@=> cat file2
wise:x:wuser:/home/wise:/sbin/nologin
nafs:x:user:/home/nafs:/sbin/nologin
jari:x:user:/home/jari:/sbin/nologin
zabbix:x:Zabbix Agent:/home/zabbix:/usr/sbin/nologin

что я ожидаю:

---
+++
@@ -6 +5,0 @@
-khor:x:khor:/home/khor:/bin/bash
@@ -8 +7 @@
-test:x:Test:/home/test:/sbin/nologin  

что я получаю:

---
+++
@@ -1 +1 @@
-nafs:x:user:/home/nafs:/sbin/nologin
+nafs:x:user:/home/nafs:/sbin/nologin
@@ -6 +5,0 @@
-khor:x:khor:/home/khor:/bin/bash
@@ -8 +7 @@
-jari:x:user:/home/jari:/sbin/nologin
+jari:x:user:/home/jari:/sbin/nologin
@@ -12 +10,0 @@
-test:x:Test:/home/test:/sbin/nologin

я запустил свой код без части сравнения и напечатал text1 и text2, чтобы найти проблему, и я увидел, что рядом со строками стоит \n они были возвращены неверно в одном файле, а не в другом.

1 Ответ

1 голос
/ 08 января 2020

Полоска каждая строка?

text1 = [l.strip() for l in open(str(path1))]
...