Vergleich zweier Dateiinhalte

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
egon11
User
Beiträge: 363
Registriert: Mittwoch 14. Dezember 2016, 20:59

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()
Sirius3
User
Beiträge: 18260
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
Benutzeravatar
ThomasL
User
Beiträge: 1378
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

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?
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
egon11
User
Beiträge: 363
Registriert: Mittwoch 14. Dezember 2016, 20:59

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.
Sirius3
User
Beiträge: 18260
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
egon11
User
Beiträge: 363
Registriert: Mittwoch 14. Dezember 2016, 20:59

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.
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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.
Sirius3
User
Beiträge: 18260
Registriert: Sonntag 21. Oktober 2012, 17:20

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')
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

@/me sehe deine Post erst jetzt.
egon11
User
Beiträge: 363
Registriert: Mittwoch 14. Dezember 2016, 20:59

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.
egon11
User
Beiträge: 363
Registriert: Mittwoch 14. Dezember 2016, 20:59

Vielen Dank.
Antworten