Seite 1 von 1

"print(line)" liefert andere Ausgabe in "while line"- als in "for line"-Schleife

Verfasst: Donnerstag 23. Februar 2023, 00:41
von Deutscher Michel
Hallo,
lese unter Linux eine Windows-Textdatei und gebe den Inhalt auf Kommandozeile aus.
mit "while line:" wird bei z.B. in der Zeile "Möller, Gudrun" plus Leerzeile folgendes angezeigt:
b'M\xfcller, Gudrun\r\n'
b'\r\n'
mit "for line in file:" (hier auskommentiert) jedoch:
M�ller, Gudrun
<Leerzeile>
Hier der Code:

Code: Alles auswählen

import os
os.system('clear')

file = open("AdrTel.txt", "rb")
line = file.readline().decode(errors='replace')
while line:             # gibt Hyroglyphen aus bei Sonderzeichen
# for line in file:   # b am Zeilenanfang, gibt Escape-Sequenzen aus wie \r\n und ersetzt Sonderzeichen durch "x"
    print (line)
    line = file.readline().decode(errors='replace')
    # line = file.readline().decode(errors='ignore')
file.close()
Wie muss ich mit den Schleifen umgehen?

Danke für eure Antworten
Michel

PS: Bin Python Neuling

Re: "print(line)" liefert andere Ausgabe in "while line"- als in "for line"-Schleife

Verfasst: Donnerstag 23. Februar 2023, 08:31
von sparrow
Warum öffnest du die Datei in Binärmodus? Handelt es sich um eine Binär- oder eine Textdatei? Wohl eher eine Textdatei, also ist der mode "r" und nicht "rb'.

Man gibt bei Öffnen von Textdatei immer das Encoding an. Das hast du hier nicht getan, deshalb kommt der Fehler. Du musst also herausfinden, welches encoding die Textdatei hat und das bei open als Parameter mitgeben.

Hinter print gehört kein Leerzeichen. Das ist ein Funktionsaufruf und zwischen Funktionsname und Parameterliste gehört kein Leerzeichen.

Alles was da mit decode steht kannst du weg werfen. Dafür ist der o. g. Parameter bei open da.

open verwendet man immer mit dem with statement.

Re: "print(line)" liefert andere Ausgabe in "while line"- als in "for line"-Schleife

Verfasst: Donnerstag 23. Februar 2023, 08:37
von __blackjack__
@Deutscher Michel: Du machst da in beiden fällen etwas grundlegend anders was nichts mit ``while`` oder ``for`` beziehungsweise `print()` zu tun hat.

Der eigentliche Fehler setzt viel früher an: Warum öffnest Du eine *Text*datei im *Binär*modus? Eine Textdatei öffnet man im Textmodus und gibt die Kodierung beim `open()` an. Vorzugsweise die *korrekte*, dann braucht man auch bei `errors` nichts übergeben.

Zu ``while`` wäre noch zu sagen, dass Python keine Syntax für eine nachprüfende Schleife hat, sondern nur ``while`` wo eine Bedingung vor jedem Schleifendurchlauf geprüft wird. Der idiomatische Weg in Python wenn man eine nachprüfende Schleife braucht, ist eine “Endlosschleife“ (``while True:``), wo in der Schleife an der entsprechenden Stelle mit ``if`` die Bedingung geprüft wird, und die Schleife dann mit ``break`` verlassen wird. Damit vermeidet man Code doppelt zu schreiben, wie hier die ``line = …``-Zeile, oder eine Variable mit einem Dummywert belegen zu müssen.

Beim öffnen von Dateien sollte man wo immer das möglich ist, die ``with``-Anweisung verwenden, damit das schliessen in jedem Fall sichergestellt ist.

Das da "Möller" statt "Müller" herauskommen soll ist recht unwahrscheinlich, sofern Datei und System nicht auf EBCDIC Kodierung(en) eingestellt ist. Und dort dann für die Datei türkisch, isländisch, oder dänisch, und das System auf dänisch-norwegisch, oder schwedisch-finnisch.

Re: "print(line)" liefert andere Ausgabe in "while line"- als in "for line"-Schleife

Verfasst: Donnerstag 23. Februar 2023, 20:10
von Deutscher Michel
Ich danke euch, jetzt klappt's.
Mein Problem war es, den Zeichencode der Textdatei (-> Latin1 / ISO8859-1) herauszufinden.
Die Installation von chardet, welches diesen wohl zurückgibt, hat bei mir (Debian 11) nicht funktioniert. So habe ich es "händisch" herausgefunden.
Michel

Re: "print(line)" liefert andere Ausgabe in "while line"- als in "for line"-Schleife

Verfasst: Freitag 24. Februar 2023, 11:31
von DeaD_EyE
Was mich wundert, dass niemand andere darauf gekommen ist.
Das ist ein zu erwartender Standard-Fehler bei Windows-Nutzern.

Das hat mir schon paar mal geholfen, Textdateien mit kaputtem Encoding zu retten: https://pypi.org/project/ftfy/

Re: "print(line)" liefert andere Ausgabe in "while line"- als in "for line"-Schleife

Verfasst: Freitag 24. Februar 2023, 12:44
von __blackjack__
@DeaD_EyE: Pssst, ich bin da drauf gekommen. Sonst hätte ich ja nicht gewusst das Möller ziemlich sicher falsch war und da eigentlich Müller in der Datei steht.