verzwicktes Umlaut /unicode Problem
Hallo, ich hab da ein verzwicktes Problem mit Umlauten, bei dem mir auch die Lektüre der python unicode Radgeber nicht weitergeholfen hat: Ich hab eine csv Datei die ich mit hilfe des csv Moduls in ein Dictionary umwandle. In dieser befinden sich in manchen Zeilen Umlaute (im Editor im Klartext zu sehen). Dann habe ich eine xml Datei (<?xml version="1.0" encoding="UTF-8"?>) die ich mit Hilfe eines Regulären Ausdrucks nach Feldern (z.B. <<hallo>>) durchsuche. Ich splitte den Text, ersetze die Felder durch Einträge aus dem Dictionary und füge sie wieder zusammen. Nun das konkrete Problem mit den Umlauten: Fall ohne unicode: ohne Umlaut in der csv Zeile ist alles OK. Wenn ich die csv Datei mit open("...", "rb") einlese und in der Zeile, die ich verarbeite ein Umlaut ist dann sind im zusammengesetzten Dokument die Umlaute kryptisch, die aus dem xml File kamen, die aus der csv sind korrekt dargestellt. Wenn ich die csv Datei mit open("...", "r") einlese und in der Zeile, die ich verarbeite ein Umlaut ist dann sind im zusammengesetzten Dokument die Umlaute nicht mehr im Klartext, die aus dem csv File kamen, die aus der csv sind korrekt dargestellt. Wenn ich das Dictionary ausgebe erhalte ich für ein ü z.B. \\xc4\\x87. Wenn ich die Einträge aus dem Dictionary herausholen sind sie vom Typ String. Kann mir jemand sagen was das für eine Codierung ist, die da im Dictionary für ein ü steht und wie ich sie mit dem String Text zusammen bekomme? Wenn ich die Einträge im Dictionary nun utf8 codieren will, erhalte ich die Fehlermeldung "UnicodeDecodeError: 'utf8' can't decode bytes in positon 2-4 invalid data". An vielen anderen Stellen habe ich auch versucht hin und her zu codieren, war aber nicht erfolgreich. Vielen Dank schon mal, Alex.
Alexander Crössmann schrieb:
Hallo,
ich hab da ein verzwicktes Problem mit Umlauten, bei dem mir auch die Lektüre der python unicode Radgeber nicht weitergeholfen hat:
schau dir mal die Unicode FAQ von Gerson Kurz an. http://p-nand-q.com/python/unicode_faq.html Gruß Mike
Am Mittwoch, den 04.06.2008, 16:52 +0200 schrieb Alexander Crössmann:
Hallo,
ich hab da ein verzwicktes Problem mit Umlauten, bei dem mir auch die Lektüre der python unicode Radgeber nicht weitergeholfen hat:
Bist du sicher das es immer UTF-8 als Encoding ist? Was sagt den z.B. "file dateiname" dazu... mfg Betz Stefan -- Betz Stefan -- Webdesign & Computerservice URL: http://www.stefan-betz.net Mail: info@stefan-betz.net
Alexander Crössmann schrieb:
ich hab da ein verzwicktes Problem mit Umlauten, bei dem mir auch die Lektüre der python unicode Radgeber nicht weitergeholfen hat:
Ich hab eine csv Datei die ich mit hilfe des csv Moduls in ein Dictionary umwandle. In dieser befinden sich in manchen Zeilen Umlaute (im Editor im Klartext zu sehen).
Dann habe ich eine xml Datei (<?xml version="1.0" encoding="UTF-8"?>) die ich mit Hilfe eines Regulären Ausdrucks nach Feldern (z.B. <<hallo>>) durchsuche. Ich splitte den Text, ersetze die Felder durch Einträge aus dem Dictionary und füge sie wieder zusammen.
Es gab ja schon einige Hinweise. Ich möchte noch diesen hinzufügen: Arbeite intern auf jeden Fall mit unicode. D.h. du liest die XML-Datei und dekodierst sie mit UTF-8. Das gleiche machst du mit den CSV-Daten, bevor du sie in das CSV-Modul schiebst. So kannst du deine Probleme auf das Raten/Erkennen des korrekten Encodings reduzieren und getrennt angehen. Eventuell hilft dir chardet für das Encoding der CSV-Datei. fs
Hallo, Alexander Crössmann schrieb:
Dann habe ich eine xml Datei (<?xml version="1.0" encoding="UTF-8"?>) die ich mit Hilfe eines Regulären Ausdrucks nach Feldern (z.B. <<hallo>>) durchsuche.
Kann ich nur von abraten, ist grob fahrlässig. Nimm lieber ein XML tool wie lxml.
Wenn ich die csv Datei mit open("...", "rb") einlese
Schau dir das "codecs" Modul an, speziell codecs.open(). Stefan
Alexander Crössmann schrieb:
ich hab da ein verzwicktes Problem mit Umlauten, bei dem mir auch die Lektüre der python unicode Radgeber nicht weitergeholfen hat:
Ich hab eine csv Datei die ich mit hilfe des csv Moduls in ein Dictionary umwandle. In dieser befinden sich in manchen Zeilen Umlaute (im Editor im Klartext zu sehen).
Welches encoding hat deine CSV-Datei? Wie sieht, der Code ein, mit dem du die Datei einliest? Chris
Vielen Dank für die Tipps! Das Problem konnte ich nun umgehen.
Welches encoding hat deine CSV-Datei? chardet hat angegeben, dass das die Datei "MacCyrillic" codiert ist (auch wenn Sie nie auf einem Mac war). codecs.open("...", encoding="MacCyrillic") brachte aber wieder die alte Fehlermeldung. Dann habe ich die csv Datei mit meinem Editor in utf-8 umcodiert. Danach hat codecs.open('...',encoding='utf-8') auch wieder die Fehlermeldung gebracht, aber nach dem ich alle decodes und encodes aus dem Python-Code wieder herausgelöscht habe, hat Python die Dateien korrekt als Strings zusammen gefügt. Um dem Ganzen auf den Grund zu gehen müsste ich mir wahrscheinlich das csv Modul ansehen und noch mehr Experimente machen wozu ich gerade keine Zeit habe.
Wie sieht, der Code ein, mit dem du die Datei einliest? jetzt wieder so: reader=csv.reader(open(file,"rb"), delimiter=",")
Dann habe ich eine xml Datei (<?xml version="1.0" encoding="UTF-8"?>) die ich mit Hilfe eines Regulären Ausdrucks nach Feldern (z.B. <<hallo>>) durchsuche.
Kann ich nur von abraten, ist grob fahrlässig. Nimm lieber ein XML tool wie lxml. Die xml Datei ist eine content.xml Datei aus einen aufgezippten odt file. Die Felder habe ich selbst eingeführt, die haben mit xml nichts zu tun. Was könnte mir ein xml tool da helfen? Die Datei will ich ja gar nicht parsen.
Viele Grüße Alex.
participants (6)
-
Alexander Crössmann
-
Christopher Arndt
-
Felix Schwarz
-
Mike Abel
-
Stefan Behnel
-
Stefan Betz