Seite 1 von 1

Python Encoding Problem

Verfasst: Freitag 18. Oktober 2013, 15:06
von DKKA
Hallo, ich lese ein Text-File mit Python und bekomme einen String in der Art: "the letter ä is part..". Nun muss ich den String aber umwandeln damit ich einen Bytestring (?) bekomme in der Form: "the letter \xc3\xa4 is part". Ich habe versucht mit der decode Methode zu arbeiten. Manche Codebeispiele die ich im Internet gefunden habe, funktionieren nicht wirklich bei mir. Ich arbeite mit Windows 8, Eclipse und Python 2.7. Leider bin ich nach Stunden immer noch nicht auf eine Lösung gekommen. Ich verstehe diese Kodierungsgeschichte auch nicht vollständig. Ist mein Txt-File jetzt in Unicode, UTF-8 oder UTF-16?
Auslesen mache ich auf diese Art:

Code: Alles auswählen

fobj = open(path, "r")
    for line in fobj:
.......
fobj.close()
Vielen Dank für eure Hilfe, ich verzweifle langsam.

Re: Python Encoding Problem

Verfasst: Freitag 18. Oktober 2013, 15:24
von /me
DKKA hat geschrieben:Ist mein Txt-File jetzt in Unicode, UTF-8 oder UTF-16?
Wie deine Datei codiert kannst nur du sagen, da du sie erzeugt hast. Was sie garantiert nicht ist ist Unicode. Unicode ist keine Codierung, Unicode ist nur das Konzept.

Es wäre übrigens wichtig zu wissen, ob du mit Python 2 oder Python 3 arbeitest. In Python 2 sind Strings im Prinzip nur Bytesequenzen, in Python 3 echte Unicode-Objekte.

Re: Python Encoding Problem

Verfasst: Freitag 18. Oktober 2013, 15:25
von DKKA
/me hat geschrieben:
DKKA hat geschrieben:Ist mein Txt-File jetzt in Unicode, UTF-8 oder UTF-16?
Wie deine Datei codiert kannst nur du sagen, da du sie erzeugt hast. Was sie garantiert nicht ist ist Unicode. Unicode ist keine Codierung, Unicode ist nur das Konzept.

Es wäre übrigens wichtig zu wissen, ob du mit Python 2 oder Python 3 arbeitest. In Python 2 sind Strings im Prinzip nur Bytesequenzen, in Python 3 echte Unicode-Objekte.
Hallo, danke für die Antwort. Arbeite mit 2.7 wie oben beschrieben.

Re: Python Encoding Problem

Verfasst: Freitag 18. Oktober 2013, 15:30
von Hyperion
DKKA hat geschrieben:Ich verstehe diese Kodierungsgeschichte auch nicht vollständig.
Dann lies Dir mal die verlinkten Dokumente meiner Signatur durch :-) Lohnt sich!

Re: Python Encoding Problem

Verfasst: Freitag 18. Oktober 2013, 15:34
von BlackJack
@DKKA: Lesestoff: „Von Umlauten, Unicode und Encodings”.

Wenn Du mit Python 2.7 arbeitest, dann ist Dein String nach dem einlesen ein Bytestring (`str`), das heisst wenn Du sagst der sieht so aus: "the letter ä is part.." hilft uns das nicht weiter weil es davon abhängt woher Du weisst das der so aussieht. Denn dann ist der Text in der selben Kodierung gespeichert die auch für die Anzeige verwendet wird, wir wissen aber nicht welche das ist. Nur dass man damit offensichtlich ein ä kodieren kann, was nicht mit jeder Kodierung geht.

Und wenn Du sagst Du willst eine Bytezeichenkette mit dem Inhalt "the letter \xc3\xa4 is part" meinst Du dann *tatsächlich* mit diesem Inhalt, also nach dem Wort „letter” ein Leerzeichen gefolgt von einem rückwärtsgerichteten schrägstrich, gefolgt von dem Zeichen x und so weiter? Warum wollte man so etwas wollen? Oder meinst Du eine UTF-8-kodierten Bytezeichenkette die ein ä kodiert? Dann sieht die Zeichenkette selbst nicht so aus, sondern das wäre nur eine repräsentation von den zwei Bytewerten die ä kodieren die man in Python bei Zeichenkettenliteralen verwenden kann um in reinem ASCII beliebige Bytewerte anzugeben.

In welcher Kodierung deine Textdatei vorliegt musst *Du* wissen. Diese Information ist in allgemeinen Textdateien nicht gespeichert. Da sind nur Bytewerte gespeichert in irgendeiner Kodierung die das Programm mit dem der Text gespeichert wurde explizit oder implizit verwendet hat.

Anmerkung am Rande: Dateien sollte man mit der ``with``-Anweisung verwenden, damit die auch in jedem Fall wieder geschlossen werden. Und wenn Du herausgefunden hast in welcher Kodierung die Textdatei vorliegt, kannst Du `io.open()` verwenden um die Zeilen beim einlesen von Bytezeichenketten (`str`) in Unicode-Objekte (`unicode`) dekodieren zu lassen.