Inhalte zweier .txt Dateien abgleichen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Logic93
User
Beiträge: 2
Registriert: Mittwoch 21. Oktober 2020, 20:37

Hallo,

ich habe folgendes Problem:
Ich habe zwei Text-Dateien, welche zu ca. 95% aus dem gleichen Inhalt (identische Zeilen) bestehen, welche allerdings nicht zwingendermaßen an gleicher Stelle der beiden Dokumente stehen.
Die anderen 5% der Zeilen der beiden Dokumente unterscheiden sich ganz oder teilweise.
Ein Beispiel könnte so aussehen:

file1.txt

Code: Alles auswählen

aaa
key=xxx
bbb
ccc
file2.txt

Code: Alles auswählen

bbb
aaa
ccc
key=yyy
Mein Ziel ist es die Zeilen von file1.txt auszugeben, welche in file2.txt (unabhängig der Positon) nicht gefunden worden bzw. abweichen. Hier im Beispiel wäre dies dann: "key=xxx".
Mein geplantes vorgehen war file1.txt zeilenweise durchzugehen und jede Zeile für Zeile in file2.txt zu suchen. Sofern diese nicht gefunden wird, die aktuelle Zeile auszugeben. Allerdings funktioniert mein Code nicht korrekt und gibt mir keine korrekten Werte aus bzw. auch Zeilen die in beiden Dokumenten vorhanden sind im oben genannten Beispiel "ccc".
Mir ist jedoch nicht wirklich klar wo hier das Problem liegt :?:

Code: Alles auswählen

fileOne = open("file1.txt")
for lineOne in fileOne:
	lineIsPresent = False
	
	fileTwo = open("file2.txt")
	for lineTwo in fileTwo:
		if(lineOne == lineTwo):
			lineIsPresent = True
	fileTwo.close()
	
	if(lineIsPresent == False):
		print(lineOne)

fileOne.close()
__deets__
User
Beiträge: 14538
Registriert: Mittwoch 14. Oktober 2015, 14:29

Die Datenstruktur die das schon mitbringt nennt sich “set” und ist in Python schon eingebaut.
Sirius3
User
Beiträge: 17748
Registriert: Sonntag 21. Oktober 2012, 17:20

Eingerückt wird in Python mit 4 Leerzeichen pro Ebene, keine Tabs. Variablennamen werden komplett klein geschrieben. if ist keine Funktion, die Klammern daher überflüssig. Dateien öffnet man am besten innerhalb eines with-Statements.

Code: Alles auswählen

with open("file1.txt") as file_one
    for line_one in file_one:
        line_is_present = False
        with open("file2.txt") as file_two
            for line_two in file_two:
                if line_one == line_two:
                    line_is_present = True
        if not line_is_present:
            print(line_one)
Der Code an sich funktioniert, wenn die Zeilen wirklich exakt gleich sind. Vielleicht unterscheiden sich die Zeilen ja in nicht-sichtbaren Zeichen.
Effizienter geht das aber mit sets:

Code: Alles auswählen

with open("file2.txt") as file_two
    lines_two = set(file_two)
with open("file1.txt") as file_one
    for line_one in file_one:
        if line_one not in lines_two:
            print(line_one)
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Wenn die Dateigrößen sich in Grenzen halten, kann man auch direkt zwei Sets nutzen.

Alle Elemente, die in der ersten Datei sind, aber nicht in der zweiten vorkommen:

Code: Alles auswählen

set(file1) - set(file2)
Zum schnellen Überprüfen des Verhaltens:

Code: Alles auswählen

print({1, 2, 3} - {2, 3, 4})
# -> {1}
nezzcarth
User
Beiträge: 1634
Registriert: Samstag 16. April 2011, 12:47

Wie ist es denn in solchen Fällen:

Datei 1:

Code: Alles auswählen

aa
bb
cc
cc
Datei 2

Code: Alles auswählen

aa
cc
bb
aa
bb
cc
Wenn solche Wiederholungen berücksichtigt werden sollen, sind sets nicht geeignet.

Man braucht (unter Linux/Unix), aber auch nicht unbedingt ein Python-Skript dafür:

Code: Alles auswählen

$ comm -1 -3 <(sort file1.txt) <(sort file2.txt)
aa
bb
$ comm -1 -3 <(sort -u  file1.txt) <(sort -u file2.txt)
Logic93
User
Beiträge: 2
Registriert: Mittwoch 21. Oktober 2020, 20:37

Vielen Dank für die Antworten. Das Problem lag wirklich nur in nicht-sichtbaren Zeichen innhalb des .txt files.
Antworten