Ich möchte Daten wie [1,2,'a','He said "what do you mean?"']
in eine CSV-formatierte Zeichenfolge umwandeln.
Normalerweise würde man csv.writer()
dies verwenden, da es alle verrückten Randfälle behandelt (Komma-Escape, Anführungszeichen-Escape, CSV-Dialekte usw.). Der Haken ist, dass csv.writer()
erwartet wird, dass die Ausgabe an ein Dateiobjekt und nicht an eine Zeichenfolge erfolgt.
Meine aktuelle Lösung ist diese etwas hackige Funktion:
def CSV_String_Writeline(data):
class Dummy_Writer:
def write(self,instring):
self.outstring = instring.strip("\r\n")
dw = Dummy_Writer()
csv_w = csv.writer( dw )
csv_w.writerow(data)
return dw.outstring
Kann jemand eine elegantere Lösung geben, die die Randfälle immer noch gut handhabt?
Edit: So bin ich dazu gekommen:
def csv2string(data):
si = StringIO.StringIO()
cw = csv.writer(si)
cw.writerow(data)
return si.getvalue().strip('\r\n')
StringIO()
befindet sich in derio
Bibliothek.Antworten:
Sie könnten
StringIO
anstelle Ihrer eigenen verwendenDummy_Writer
:Es gibt auch
cStringIO
eine schnellere Version derStringIO
Klasse.quelle
In Python 3:
Einige Details müssen für Python 2 etwas geändert werden:
quelle
\n
Ordnung, Daten in der Mitte zu haben, zeigt aber\r\n
das Ende eines Datensatzes an, unabhängig davon, wo er angezeigt wird? (Angenommen, Sie befinden sich auf einer Plattform, die\r\n
als Leitungsterminator verwendet wird.)output = StringIO.StringIO()
,io.StringIO()
wird TypeError auslösen: String-Argument erwartet, 'str'.writer.writerow(...)
Zeile (unicode argument expected, got 'str'
) bekomme . Werde das untersuchen.io.BytesIO()
stattio.StringIO()
.Alles in allem fand ich die Antworten etwas verwirrend. Für Python 2 funktionierte diese Verwendung für mich:
quelle
Da ich dies ziemlich oft benutze, um Ergebnisse asynchron von sanic zurück zum Benutzer als CSV-Daten zu streamen, habe ich das folgende Snippet für Python 3 geschrieben .
Mit dem Snippet können Sie denselben StringIo-Puffer immer wieder verwenden.
Beispiel:
Weitere Informationen finden Sie im Github-Gist: Quelle und Test
quelle
quelle
Hier ist die Version, die für utf-8 funktioniert. csvline2string für nur eine Zeile, ohne Zeilenumbrüche am Ende, csv2string für viele Zeilen, mit Zeilenumbrüchen:
quelle