nicht unicode Informationen auf Excel-Datei nach CSV

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.
Antworten
Net_Hans
User
Beiträge: 4
Registriert: Dienstag 21. Februar 2012, 15:02

Hallo,

ich habe Excel-Dateien in denen nicht unicode-Texte enthalten sind. Diese Texte können zum Beispiel wie folgt aussehen "Ar 2 Störfallnummer [ohne]"
Die Excel-Dateien lese ich mit der Lib "xlrd" aus. Die Lib liefert mir die Textstelle auch mit den nicht unicode-Daten sauber zurück. Wenn ich diesen Text dann aber in eine Text-Datei schreiben will, bekomme ich immer eine Fehlermeldung ähnlich der folgenden

Code: Alles auswählen

UnicodeEncodeError: 'ascii' codec can't encode characters in position 113-114: ordinal not in range(128)
Könnt Ihr mir sagen, wie man mit solchen Strings umgehen muss, damit man sie sauber in eine Textdatei schreiben kann?

Danke
mfG Hans
BlackJack

@Net_Hans: Was sind denn in dem Fall ”nicht-unicode-Texte” und wo siehst Du "Ar 2 Störfallnummer [ohne]"? Wird das in *Excel* *so* angezeigt? Dann steht da fehlerhafter Text in der Excel-Tabelle. Denn `xlrd` sollte bei Zellen die nicht nur ASCII-Zeichen enthalten *Unicode* liefern. Und das kannst Du dann natürlich nicht in eine Datei schreiben ohne das es vorher oder auf dem Weg dorthin *kodiert* wird. Das sagt ja auch die Fehlermeldung, dass da was ist was nicht als ASCII kodiert werden kann, weshalb man explizit mit Angabe der gewünschten Kodierung kodieren muss. Das kann man entweder direkt vor dem Schreiben mit der `encode()`-Methode auf dem `unicode`-Objekt machen, oder man benutzt `io.open()` und gibt dort beim öffnen der Datei eine Kodierung an.
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@Net_Hans: excel hat keine nicht-unicode Texte. Das sind zwei Unicode-Zeichen A mit Tilde (U+00C3) und Paragraphzeichen (U+00B6). Und beim Schreiben muß man sich immer um die Codierung kümmern. Wenn Du glaubst, hier wurde utf-8 falsch als Latin1 decodiert und dann wieder als utf-8 encodiert, dann mußt Du diese Kette an Codierungen wieder rückgängig machen:

Code: Alles auswählen

text = text.encode('latin1').decode('utf8')
Antworten