Seite 1 von 1

csv export quoting

Verfasst: Freitag 30. September 2016, 12:33
von chrischn
Hallo,

wenn ich ein sql Ausführe und dann als csv exportiere, wird als erstes Zeichen in der Zeile und als letztes Zeichen ein " gesetzt. Wie kann ich in meiner "dialect" Konfiguration dies unterbinden ?

Beispielexport (csv):

"Spalte1;Spalte2;Spalte3"

Die äußeren " sollen weg.

Ich habe schon diverse Einstellungen getestet, blicke dabei aber noch nicht so wirklich durch :

Code: Alles auswählen

csv.register_dialect(
    'mydialect',
    delimiter = ';',
#   escapechar='X',
#   quoting=csv.QUOTE_MINIMAL,
#   quotechar = ' ',
#   doublequote = False
    )

###############################################################################
# Überschriften

cursor = con.cursor()
cursor.execute(SQLA)
Daten = ""

# Die Daten müssen mit join zusammengefügt werden, da sonst pro Tupel alles in Klammern gesetzt wird
for row in cursor:
    Daten = Daten + '/'.join(row)
    Daten = Daten + ';'

print (Daten)
cursor.close()

# Daten in [] damit der String als 1 gesamtes Tupel erkannt wird und nicht einzelne Zeichen des Strings

output.writerow([Daten])


Viele Grüße
Chrischn

Re: csv export quoting

Verfasst: Freitag 30. September 2016, 12:51
von Sirius3
@chrischn: Du schreibst pro Zeile einen String, der Sonderzeichen wie ';' enthält. Du willst wahrscheinlich aber mehrere Spalten haben. Dann übergib einfach eine Liste an writerow, statt die Daten selbst per String-+ zusammenzustückeln.

Code: Alles auswählen

cursor = con.cursor()
cursor.execute(SQLA)
output.writerow([['/'.join(row) for row in cursor]])
cursor.close()

Re: csv export quoting

Verfasst: Freitag 30. September 2016, 12:55
von BlackJack
@Sirius3: Bei da sind jetzt einmal Listenklammern zu viel bei dem Aufruf.

@chrischn: Willst Du wirklich eine Spalte pro Datensatz haben?

Re: csv export quoting

Verfasst: Dienstag 4. Oktober 2016, 09:08
von chrischn
Ich wollte halt einfach das, was in Daten steht in die Textdatei schreiben. Manchmal beisst man sich ja zu sehr in eine Richtung fest, anstatt nochmal nachzudenken. Ich habe es jetzt einfach mit "FILE.write(Daten)" hinbekommen.

Mich hatte diese ganze "dialect"/"escapechar" / ...Geschichte etwas verwirrt.


Gruß
Chrischn

Re: csv export quoting

Verfasst: Dienstag 4. Oktober 2016, 09:35
von BlackJack
@chrischn: Mit den Dialekten und dem „escapechar” muss man sich normalerweise ja auch gar nicht auseinandersetzen. In 99,9% der Fälle reicht es einfach aus dem Writer beim erstellen den `delimiter` mitzugeben falls der kein Komma sein soll und es passiert schon das richtige.

Du hast jetzt zwei Probleme: 1. Ist das unglaublich ineffizient wie Du `Daten` aufbaust weil Zeichenketten unveränderbar sind, das heisst in jedem Schleifendurchlauf wird eine neue Zeichenkette erstellt die aus dem alten, immer grösser werdenden Teil, und dem neuen bestehen. 2. Hast Du ein Problem wenn in den Daten Sachen auftauchen die Escaped werden *müssen* weil man die Datei sonst nicht wieder eingelesen bekommt.

Re: csv export quoting

Verfasst: Dienstag 4. Oktober 2016, 10:14
von chrischn
Hy Blackjack,

zu Punkt1, um es schneller zu machen : Also sollte man nicht zuerst "Daten" erstellen und dann eine Zeile schreiben, sondern jeden Datensatz einzeln an die Textdatei dranhängen ?

Re: csv export quoting

Verfasst: Dienstag 4. Oktober 2016, 10:23
von BlackJack
@chrischn: Zum Beispiel. Oder erst in eine Liste sammeln und nach der Schleife mit `str.join()` zusammenfügen.