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.
lubb
User
Beiträge: 50 Registriert: Mittwoch 6. Januar 2010, 17:05
Montag 18. Januar 2010, 10:36
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
lubb
User
Beiträge: 50 Registriert: Mittwoch 6. Januar 2010, 17:05
Montag 18. Januar 2010, 10:57
/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?
cofi
Python-Forum Veteran
Beiträge: 4432 Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0
Montag 18. Januar 2010, 11:03
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.
lubb
User
Beiträge: 50 Registriert: Mittwoch 6. Januar 2010, 17:05
Montag 18. Januar 2010, 11:12
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)
lubb
User
Beiträge: 50 Registriert: Mittwoch 6. Januar 2010, 17:05
Montag 18. Januar 2010, 11:42
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?
/me
User
Beiträge: 3555 Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn
Montag 18. Januar 2010, 11:49
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.
lubb
User
Beiträge: 50 Registriert: Mittwoch 6. Januar 2010, 17:05
Montag 18. Januar 2010, 11:55
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.
lubb
User
Beiträge: 50 Registriert: Mittwoch 6. Januar 2010, 17:05
Montag 18. Januar 2010, 14:02
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'
/me
User
Beiträge: 3555 Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn
Montag 18. Januar 2010, 14:06
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.
lubb
User
Beiträge: 50 Registriert: Mittwoch 6. Januar 2010, 17:05
Montag 18. Januar 2010, 14:10
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.
/me
User
Beiträge: 3555 Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn
Montag 18. Januar 2010, 14:34
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.
lubb
User
Beiträge: 50 Registriert: Mittwoch 6. Januar 2010, 17:05
Montag 18. Januar 2010, 14:45
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
Zuletzt geändert von
lubb am Dienstag 19. Januar 2010, 13:41, insgesamt 1-mal geändert.
mkesper
User
Beiträge: 919 Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:
Montag 18. Januar 2010, 14:51
Speicherst du jede Zeile in eine eigene Variable ab? Die for-Schleife kann mehr als einmal im Programm verwendet werden.