Seite 1 von 1
CSV Tuple Umlaute encode
Verfasst: Montag 18. Januar 2010, 10:36
von lubb
versuche aus der Datenbank der Inhalt einer Tabelle in CSV Datei zu schreiben.
die Tabelle enthält Umlaute daher versuche ich auch die Codierung zu erkennen, dies geht bei Tuple leider nicht.
Code: Alles auswählen
cursor.execute("""SELECT * FROM testExport """)
fd = codecs.open(savefile, 'w',encoding="utf-8",)
for row in cursor:
row=row.encode("utf-8")
writer.writerow(row)
bekomme die Fehlermeldung
Re: CSV Tuple Umlaute encode
Verfasst: Montag 18. Januar 2010, 10:53
von /me
Arbeite auf dem Inhalt des Tupels.
Re: CSV Tuple Umlaute encode
Verfasst: Montag 18. Januar 2010, 10:57
von lubb
/me hat geschrieben:Arbeite auf dem Inhalt des Tupels.
meinst du?
Tupel erst in einem normalen string umgewandelt
string encode
string in CSV-File schreiben
gibt keine encode für Tuple?
Verfasst: Montag 18. Januar 2010, 11:03
von cofi
Nein, du hast den Datentyp Tupel nicht verstanden. Das ist ein _Container_ fuer Daten, kein Datum an sich*, darum kannst du das auch nicht kodieren.
mit `codecs.open` wird uebrigens alles automatisch konvertiert, sofern du Unicode-Objekte uebergibst.
* Ja, eigentlich schon, aber das macht die Betrachtung schwieriger.
Verfasst: Montag 18. Januar 2010, 11:12
von lubb
Code: Alles auswählen
fd = codecs.open(savefile, 'w',encoding="utf-8")
writer = csv.writer(fd, delimiter=trenzeichen ,quotechar=Umschliess,lineterminator=DTS , quoting=csv.QUOTE_ALL)
for row in cursor:
writer.writerow(row)
bekomme die Meldung
Code: Alles auswählen
'ascii' codec can't decode byte 0xf6 in position 1: ordinal not in range(128)
Verfasst: Montag 18. Januar 2010, 11:29
von /me
Da du anscheinend noch Schwierigkeiten damit hast zu verstehen was ein Tupel eigentlich ist, sollten wir das als erstes klären.
Schau mal unter
Tuples and Sequences.
Verfasst: Montag 18. Januar 2010, 11:42
von lubb
Es ist mir klar was Tupel sind.
Die Datenbank liefert die Ergebnisse einer Abfrage in Form Tupel (die Felder mit "," Trennzeichen getrennt)
Das Problem ist die Umlaute in dem Tupel in den gelieferten Datensätze aus der Datenbank?
Verfasst: Montag 18. Januar 2010, 11:49
von /me
lubb hat geschrieben:Es ist mir klar was Tupel sind.
Die Datenbank liefert die Ergebnisse einer Abfrage in Form Tupel (die Felder mit "," Trennzeichen getrennt)
Das ist jetzt bereits falsch. Was du beschreibst ist vielleicht eine mögliche
Anzeige eines Tupels, aber keineswegs ein Tupel.
Verfasst: Montag 18. Januar 2010, 11:55
von lubb
natürlich sind auch andere Möglichkeiten vorhanden.
in mein Situation ist das aber der Fall, nun wie komme ich zum eigentlichem Problem ?
muss ich die einzelne werte der Tuple Decodieren?
welche Möglichkeiten habe ich die Umlaute aus der Datenbank in lesbare Schrift in einer CSV-File zu schreiben.
Verfasst: Montag 18. Januar 2010, 13:09
von lubb
hat jemand eine Idee wie Das Problem gelöst werden kann?
Verfasst: Montag 18. Januar 2010, 14:02
von lubb
mit diesem versuch
Code: Alles auswählen
for row in cursor:
for s in row:
print s.decode("iso-8859-15")
wird die Umlaute erkannt aber mit Fehlermeldung
Code: Alles auswählen
öäü
Traceback (most recent call last):
File "clsExportImport.py", line 120, in onExportFunc
print s.decode("iso-8859-15")
AttributeError: 'long' object has no attribute 'decode'
Verfasst: Montag 18. Januar 2010, 14:06
von /me
lubb hat geschrieben:muss ich die einzelne werte der Tuple Decodieren?
Ja. Aber ich dachte du wolltest sie encodieren, nicht dekodieren.
Verwende encode() wenn du von Unicode nach woandershio möchtest und verwende decode() wenn du aus einen anderen Encoding nach Unicode möchtest.
Verfasst: Montag 18. Januar 2010, 14:10
von lubb
Problemstellung:
Die Daten auf dem mySQL sind mit Umlaute.
ich möchte die Daten aus der Datenbank in CSV-Schreiben.
nun werden die Umlaute aus der mySQL unlesbar in der CSV-File geschrieben.
Verfasst: Montag 18. Januar 2010, 14:34
von /me
lubb hat geschrieben:Die Daten auf dem mySQL sind mit Umlaute.
Mit Umlauten kann viel sein. In welcher Codierung liegen die Daten denn vor? UTF-8? ISO-8859-1? ISO-8859-15? EBCDIC-273?
Wenn die Daten bereits Unicode sind ist es einfach:
Code: Alles auswählen
daten = (u"föö", u"bar")
for wert in daten:
print(wert.encode("UTF-8"))
Wenn du nicht direkt Unicode hast musst du die Daten erst mit decode() zu Unicode machen bevor du sie von dort mit encode() weiterverarbeitest.
Verfasst: Montag 18. Januar 2010, 14:45
von lubb
so habe ich das Problem gelöst
Code: Alles auswählen
for row in cursor:
f1=row[0].decode("iso-8859-15")
f.....
fd.write(Umschliess+f1+Umschliess+trenzeichen+.....)
die Lösung ist zulang und unpraktisch, wie das sich bei große Datenmenge verhält das wird sich im Testbereich herausfinden.
Leider habe ich Keine alternative Lösung gefunden
ich bedanke mich für eure Hilfe und Geduld, falls es doch eine bessere Lösung gäbe, bitte posten
Beste Grüsse
Lubb
Verfasst: Montag 18. Januar 2010, 14:51
von mkesper
Speicherst du jede Zeile in eine eigene Variable ab? Die for-Schleife kann mehr als einmal im Programm verwendet werden.