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

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
Deutscher Michel
User
Beiträge: 2
Registriert: Donnerstag 23. Februar 2023, 00:13

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
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

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.
Benutzeravatar
__blackjack__
User
Beiträge: 14065
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Deutscher Michel
User
Beiträge: 2
Registriert: Donnerstag 23. Februar 2023, 00:13

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
Benutzeravatar
DeaD_EyE
User
Beiträge: 1242
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

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/
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Benutzeravatar
__blackjack__
User
Beiträge: 14065
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten