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.
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:
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()
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.
@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.
„Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.“ — Brian W. Kernighan
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
@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.
„Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.“ — Brian W. Kernighan