csv export quoting

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
chrischn
User
Beiträge: 18
Registriert: Freitag 23. September 2016, 09:35

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
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@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()
BlackJack

@Sirius3: Bei da sind jetzt einmal Listenklammern zu viel bei dem Aufruf.

@chrischn: Willst Du wirklich eine Spalte pro Datensatz haben?
chrischn
User
Beiträge: 18
Registriert: Freitag 23. September 2016, 09:35

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
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.
chrischn
User
Beiträge: 18
Registriert: Freitag 23. September 2016, 09:35

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 ?
BlackJack

@chrischn: Zum Beispiel. Oder erst in eine Liste sammeln und nach der Schleife mit `str.join()` zusammenfügen.
Antworten