Python: splitlines trennt nicht nach Zeilenumbruch?
Eine Textdatei mit Steuerzeichen hex 0D 0A 5B 31 als Zeilentrenner protestiert beim Einlesen als Textfile "wt", wenn ich dann die Zeilen lesen will
handle = open("cht.txt", "wt")
lines = handle.readlines()
Fehlermeldung, dass ein gewisses byte nicht eingelesen werden kann.
Wenn ich sie mit "wb" als Binary öffne, dann in ASCII umwandle, bekomme ich eine Datei vom Typ String.
Wende ich dann splitlines auf sie an, kommt nur eine Liste mit einem Element dabei raus.
handle = open("cht.txt", "wb")
chtlines = ascii(handle).splitlines()
Auch wenn ich ein split("\n") verwende, passiert dasselbe.
Warum wird der Zeilenumbruch nicht erkannt.
2 Antworten
![](https://images.gutefrage.net/media/default/user/5_nmmslarge.png?v=1438863662000)
0D 0A
Ist 13 10, aka Carriage-Return+Linefeed, Zeilenumbruch unter Windows/Dos.
"wt"
Führt ansich ein truncate der Datei durch.
readlines() splittet an hinter \n, also direkt hinter 13 10.
Wenn Du die Datei als Textdatei öffnest und es zu einem Fehler kommt, dann gibt es vermutlich ein Kodierungsproblem.
![](https://images.gutefrage.net/media/default/user/5_nmmslarge.png?v=1438863662000)
b steht für binary, die Datei wird "as is" gelesen und als bytes zurückgeliefert.
t öffnet als text und transofrmiert, indem sie ein decode macht. Gibst Du beim Öffnen kein Encoding explizit an, so wird anhand der Platform das gängigste Encoding bestimmt.
Der Zeilenumbruch wird automatisiert bestimmt, kann aber auch beim open() explizit angegeben werden.
In jedem Fall liefert öffnen als t dann strings zurück anstatt bytes.
Übrigens kann auch das Fehlerverhalten gesetzt werden, wenn es zu einem Decode-Fehler kommt.
![](https://images.gutefrage.net/media/user/GunnarPetite/1509041374001_nmmslarge__263_8_2075_2075_5b153817fb077280292b4ba44d6d3b21.jpg?v=1509041376000)
Normalerweise konnte ich auf Textdateien immer readlines() einsetzen, indem ich sie als t eingelesen habe. Dieses in utf-8 kodierte Dokument lies sich zwar als t einlesen, dann können aber nur die ASCII-Zeichen interpretiert werden.
Jetzt habe ich ein Problem beim zurückschreiben in eine HTML-Datei, wo ich base64-kodierte Bilder einfüge. Beim Zusammensetzen der HTML-Tags in python muss ich wohl alles kodieren, um es überhaupt aneinanderhängen zu können. Aber da meckert er trotzdem (Can´t concatenate str and byte). Obwohl ich alles schon vor dem Verknüpfen in utf-8 kodiere...
![](https://images.gutefrage.net/media/user/NackterGerd/1459631419191_nmmslarge__4_21_414_414_4344501cccc644450d864209d1253d34.jpg?v=1459631419000)
Ist es Unix?
Dort ist der Zeilenumbruch wohl eher anders
![](https://images.gutefrage.net/media/user/GunnarPetite/1509041374001_nmmslarge__263_8_2075_2075_5b153817fb077280292b4ba44d6d3b21.jpg?v=1509041376000)
![](https://images.gutefrage.net/media/user/NackterGerd/1459631419191_nmmslarge__4_21_414_414_4344501cccc644450d864209d1253d34.jpg?v=1459631419000)
Wenn die Datei mit Windows erstellt wurde ist es normalerweise CR oder CR & LF
ich hab´s jetzt mit "rb" als Byte-Objekt eingelesen, als UTF-8 decoded und dann ging es plötzlich.
Habe in google einen guten Merksatz gefunden, der mir hilft:
Encode macht aus einem Text- ein Byte-Objekt, decode aus einem Byte-Objekt ein Textobjekt.
Das hätte ich mal früher kapieren müssen...