Umlautproblem bei Excelexport (xlwt)

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
andi24
User
Beiträge: 56
Registriert: Freitag 5. März 2010, 11:42

Hallo zusammen,

ich möchte Daten aus einer ISO-8859-1 (latin1) Datenbank über ein Python-Script in eine xls-Datei schreiben. Das klappt auch solange bis der Wert einen Umlaut enthält.

Hier der wesentliche Teil des Codes:

Code: Alles auswählen

#/usr/bin/python
# -*- coding: utf-8 -*-

def main():

	# DB Verbindung herstellen und Wert aus DB holen	
	conn = initDBConnection()
	curs = createCursor(conn)
	sql="""select name from tabelle where id=1"""
	curs.execute(sql)	
	row = curs.fetchone()

	# Excel-Datei öffnen
	dateiname = "test.xls"
	book = Workbook(encoding='utf-8')
	sheet1 = book.add_sheet('MySheet')

	# Wert in Excel-Datei schreiben
	sheet1.row(1).write(0, rows[0])   # Inhalt von rows[0] ist Müller
		
	# Excel-Datei speichern und DB-Verbindung schließen
	book.save(dateiname)
	book.save(TemporaryFile())
	closeConnection(conn)
Ich bekomme dabei jedoch die Fehlermeldung:

Code: Alles auswählen

UnicodeDecodeError: 'utf8' codec can't decode bytes in position 10-15: unsupported Unicode code range
in der Zeile "sheet1.row(1).write(0, rows[0])". Das Pythonscript selbst (also das Textfile) ist als UTF-8 abgespeichert.

Kann mir da jemand weiterhelfen? Bin da langsam echt ratlos...

Vielen Dank für jeden Tip!
deets

Da du uns nicht verraetst, was du fuer eine Datenbank verwendest, kann ich jetzt nur raten - aber ich vermute mal, dass die Datenbank die Daten eben nicht als unicode-Objekte zurueckgibt, sondern als byte-strings. Die moegen zwar in latin1 encodiert sein, aber das weiss ja keiner.

Die sauberste Loesung waere demnach, die Datenbank-Verbindung so zu oeffnen, dass schon gleich die Datenbank (bzw der Adapter) unicode-Objekte zurueckliefert. Wie das genau geht, haengt von der DB ab.
BlackJack

@andi24: Das gibt einen `NameError` in der Zeile weil `rows` nirgends definiert wird. Ansonsten müsstest Du schon etwas genauer bestimmen was der Inhalt von ``rows[0]`` ist. Einfach nur Müller reicht nicht. Das ist abstrakt gesehen was da drin sein sollte, aber ganz konkret welcher Typ ist das denn? `str`? `unicode`? Wenn `str`, dann in welcher Kodierung? ISO-8859-1? Falls ja, dann sollte es nicht weiter verwundern dass der 'M\xfcller' nicht als UTF-8 dekodiert werden kann.
andi24
User
Beiträge: 56
Registriert: Freitag 5. März 2010, 11:42

Vielen Dank für euere schnellen Antworten!

Mit

Code: Alles auswählen

sheet1.row(1).write(0, rows[0].decode('iso-8859-1').encode('utf-8'))
hat es geklappt!
Antworten