Ich hab vor Jahren ein Programm in Python 2 geschrieben, das ich nun nach Python 3 migrieren will. Wie erwartet, scheitere ich schon an trivialen Dingen.. File "klickifexi.py", line 800, in parse_url url = despace(url) File "klickifexi.py", line 3303, in despace return ' '.join(s.split()) TypeError: sequence item 0: expected str instance, bytes found Die entsprechende Funktion sieht so aus: def despace(s): return ' '.join(s.split()) Das soll (Wihte-)Spaces am Anfang und Ende eines Strings entfernen und aus Multi-Spaces einen einzelnen machen. Mit Python 2 funktioniert das auch. Wieso liefert string.split() bytes zurueck und nicht wieder str? Wie macht mans besser? -- Ullrich Horlacher Server und Virtualisierung Rechenzentrum TIK Universitaet Stuttgart E-Mail: horlacher@tik.uni-stuttgart.de Allmandring 30a Tel: ++49-711-68565868 70569 Stuttgart (Germany) WWW: http://www.tik.uni-stuttgart.de/
Am 25.08.19 um 10:00 schrieb Ulli Horlacher:
Die entsprechende Funktion sieht so aus:
def despace(s): return ' '.join(s.split())
Das soll (White-)Spaces am Anfang und Ende eines Strings entfernen und aus Multi-Spaces einen einzelnen machen.
Mit Python 2 funktioniert das auch.
Wieso liefert string.split() bytes zurueck und nicht wieder str?
Weil vermutlich string vorher vom type bytes war.
Wie macht mans besser?
Mit print(type(s)) an einigen Stellen nachschauen warum s nicht vom Typ str ( Buchstaben in utf ) ist Hermann vermutend, das iso utf Probleme noch Jahrzehnte erhalten bleiben. -- http://www.hermann-riemann.de
Ulli Horlacher schrieb am 25.08.19 um 10:00:
TypeError: sequence item 0: expected str instance, bytes found
Wie macht mans besser?
Grundregel: die Eingabedaten immer gleich beim Einlesen dekodieren und erst beim Ausgeben wieder kodieren, damit du innerhalb deines Programmes überall mit Unicode (sprich: Text) arbeiten kannst. Das Dekodieren erledigt Python (3) oft auch automatisch, z.B. wenn du von stdin oder aus einer UTF8-Textdatei (oder JSON/XML/...) liest. Alles andere musst du aber explizit einstellen, z.B. bei "open()" mit der "encoding=..." Option. Das Kodieren passiert z.B. beim Schreiben nach stdout (oder stderr) auch automatisch, in anderen Fällen musst du es aber explizit machen, insbesondere beim Schreiben in Dateien, denn Python kann nicht wissen, ob du die Datei in UTF-8 oder EBCDIC kodiert haben möchtest. In deinem Fall liegt das Problem also überhaupt nicht an der Stelle, an der du den Fehler bekommst, sondern irgendwo vorher, wo du Daten in Bytes einliest, ohne sie zu dekodieren. Python 3 macht den Programmfehler offensichtlich, den Python 2 früher so halbwegs unter den Teppich gekehrt hat (und der dadurch öfter mal nach Jahren noch zu unschönen Überraschungen geführt hat). Stefan
participants (3)
-
Hermann Riemann -
Stefan Behnel -
Ulli Horlacher