Seite 1 von 1

Vergleich zweier Dateiinhalte

Verfasst: Mittwoch 19. Dezember 2018, 19:56
von egon11
Ich möchte 2 Dateiinhalte prüfen, ob sie gleich sind.
Da habe ich mir den funktionierenden Code gebastelt.
Nur noch mal als Bestätigung ob ich ihn so lassen kann.
Er funktioniert so wie ich es möchte.

Code: Alles auswählen

files1 = open("/home/matze/f")
files2 = open("/home/matze/ff")

while True:
    read1 = files1.readlines()
    read2 = files2.readlines()
    if read1 != read2:
        print("ungleich")
        break
    elif read1 or read2 == "":
        print("gleich")
        break

files1.close()
files2.close()

Re: Vergleich zweier Dateiinhalte

Verfasst: Mittwoch 19. Dezember 2018, 20:06
von Sirius3
Dateien öffnet man am besten mit dem with-Statement. `files1` und `files2` sind schlechte Namen, weil es sich ja nicht um mehrere Files handelt. `read1` und `read2` sind schlechte Namen, weil dass was gelesen wurde ja nicht wichtig ist, sondern nur, dass es sich um den Inhalt handelt, also content1, content2. Die elif-Bedingung ist seltsam, also entweder ist read1 nicht leer, oder die Liste read2 gleich einem leeren String. Zweiter Teil tritt nie ein, erster Teil behauptet, dass eine nichtleere Datei 1 immer gleich jeder beliebigen Datei zwei ist. Zum Glück wurde die Ungleichheit schon im if abgehandelt. Bleibt eine Leere Datei 1, die zu einer Endlosschleife führt, wegen des while-True, was gar keinen Sinn macht.

Re: Vergleich zweier Dateiinhalte

Verfasst: Mittwoch 19. Dezember 2018, 20:10
von ThomasL
das hier

Code: Alles auswählen

elif read1 or read2 == ""
funktioniert nicht so wie du dir das vermutlich denkst.
Es wird der Teil vor dem "or" auf Wahrheit geprüft und nur wenn das False ist, wird der Teil nach dem "or" auf Wahrheit geprüft.
Warum bringst du diese Kondition noch in den "else" Zweig?

Was machst du, wenn die Dateien jeweils 1 Terabyte groß sind? Hast du soviel Hauptspeicher?

Re: Vergleich zweier Dateiinhalte

Verfasst: Mittwoch 19. Dezember 2018, 20:18
von egon11
wenn ich in die 1. Datei ein Zusatzzeichen schreibe, gibt es mir "ungleich" aus.
Sind die Dateien wirklich gleich, dann gibt er mir "gleich" aus.

Re: Vergleich zweier Dateiinhalte

Verfasst: Mittwoch 19. Dezember 2018, 20:41
von Sirius3
@egon11: Du kannst weiterhin behaupten, dass das Programm für Deine beschränkten Testfälle scheinbar richtige Ergebnisse liefert. Für eine leere Datei ist das aber nicht der Fall.
Du wolltest wissen, ob Du ihn so lassen kannst, und die Antwort ist: nein.
Die Fragen sind also, was soll die while-Schleife? Was soll die elif-Abfrage?

Feinheiten sind with-Statement und blockweises Lesen, statt alles auf einmal in den Hauptspeicher zu laden.

Re: Vergleich zweier Dateiinhalte

Verfasst: Mittwoch 19. Dezember 2018, 21:25
von egon11
Ok. Ich werde mal schauen das ich es berichtige.
Es soll letztendlich Zeile für Zeile lesen und vergleichen, sobald sich eine Zeile anders soll es eine Anweisung geben.
Edit: Ich habe schon die "map" - Funktions ins Auge, gefasst.

Re: Vergleich zweier Dateiinhalte

Verfasst: Mittwoch 19. Dezember 2018, 21:49
von /me
egon11 hat geschrieben: Mittwoch 19. Dezember 2018, 21:25 Es soll letztendlich Zeile für Zeile lesen und vergleichen, sobald sich eine Zeile anders soll es eine Anweisung geben.
Das wäre dann etwa so etwas:

Code: Alles auswählen

filename_1 = 'file_1.txt'
filename_2 = 'file_2.txt'
with open(filename_1, 'r') as file_1, open(filename_2, 'r') as file_2:
    for line_1, line_2 in zip(file_1, file_2):
        if line_1 != line_2:
            print('ungleich')
            break
Um auch unterschiedlich lange Dateien korrekt zu behandeln sollte man zip noch mit zip_longest aus itertools ersetzen.

Re: Vergleich zweier Dateiinhalte

Verfasst: Mittwoch 19. Dezember 2018, 21:55
von Sirius3
Besser mit `all`:

Code: Alles auswählen

filename1 = 'file_1.txt'
filename2 = 'file_2.txt'
with open(filename1) as lines1, open(filename2) as lines2:
    if all(a == b for a, b in zip_longest(lines1, lines2)):
        print('gleich')

Re: Vergleich zweier Dateiinhalte

Verfasst: Mittwoch 19. Dezember 2018, 22:30
von /me
Sirius3 hat geschrieben: Mittwoch 19. Dezember 2018, 21:55 Besser mit `all`:
Ich hatte "sobald sich eine Zeile anders soll es eine Anweisung geben" so interpretiert, dass jetzt speziell mit dieser Zeile etwas getan werden soll.

Re: Vergleich zweier Dateiinhalte

Verfasst: Mittwoch 19. Dezember 2018, 22:37
von __deets__
Was macht das denn das all(..) anders als ein simples lines1 == lines2? Genauso wie der Code von /me? Gleichheit von Listen doch genau so definiert, das punktweise verglichen wird - aber natürlich auch die Gesamtlänge mit einbezogen.

Re: Vergleich zweier Dateiinhalte

Verfasst: Mittwoch 19. Dezember 2018, 22:38
von __deets__
@/me sehe deine Post erst jetzt.

Re: Vergleich zweier Dateiinhalte

Verfasst: Mittwoch 19. Dezember 2018, 23:10
von egon11
Ich hatte "sobald sich eine Zeile anders soll es eine Anweisung geben" so interpretiert, dass jetzt speziell mit dieser Zeile etwas getan werden soll.
Ja genau, sobald eine Zeile anders ist soll es eine Anweisung geben.

Re: Vergleich zweier Dateiinhalte

Verfasst: Donnerstag 20. Dezember 2018, 07:59
von egon11
Vielen Dank.