CSV Tuple Umlaute encode

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
lubb
User
Beiträge: 50
Registriert: Mittwoch 6. Januar 2010, 17:05

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

Code: Alles auswählen

'tuple' object has no attribute 'encode'
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Arbeite auf dem Inhalt des Tupels.
lubb
User
Beiträge: 50
Registriert: Mittwoch 6. Januar 2010, 17:05

/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?
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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

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)

Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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.
lubb
User
Beiträge: 50
Registriert: Mittwoch 6. Januar 2010, 17:05

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?
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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

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

hat jemand eine Idee wie Das Problem gelöst werden kann?
lubb
User
Beiträge: 50
Registriert: Mittwoch 6. Januar 2010, 17:05

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'    
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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

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.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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

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.
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Speicherst du jede Zeile in eine eigene Variable ab? Die for-Schleife kann mehr als einmal im Programm verwendet werden.
Antworten