Quiero transmitir datos como [1,2,'a','He said "what do you mean?"']
en una cadena con formato CSV.
Normalmente uno lo usaría csv.writer()
para esto, porque maneja todos los casos extremos locos (escape de comas, escape de comillas, dialectos CSV, etc.) El problema es que csv.writer()
espera generar una salida a un objeto de archivo, no a una cadena.
Mi solución actual es esta función algo hacky:
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
¿Alguien puede ofrecer una solución más elegante que aún maneje bien los casos extremos?
Editar: Así es como terminé haciéndolo:
def csv2string(data):
si = StringIO.StringIO()
cw = csv.writer(si)
cw.writerow(data)
return si.getvalue().strip('\r\n')
StringIO()
está en laio
biblioteca.Respuestas:
Podrías usar en
StringIO
lugar del tuyoDummy_Writer
:También existe
cStringIO
, que es una versión más rápida de laStringIO
clase.fuente
En Python 3:
Algunos detalles deben cambiarse un poco para Python 2:
fuente
\n
bien tenerlo en medio de los datos, pero\r\n
indica el final de un registro sin importar dónde aparezca? (Suponiendo que está en una plataforma que utiliza\r\n
como terminador de línea)output = StringIO.StringIO()
,io.StringIO()
generará TypeError: argumento de cadena esperado, obtuvo 'str'.writer.writerow(...)
línea (unicode argument expected, got 'str'
). Investigaré esto.io.BytesIO()
lugar deio.StringIO()
.Encontré las respuestas, en general, un poco confusas. Para Python 2, este uso funcionó para mí:
fuente
ya que uso esto bastante para transmitir resultados de forma asincrónica desde sanic al usuario como datos csv, escribí el siguiente fragmento para Python 3 .
El fragmento le permite reutilizar el mismo búfer StringIo una y otra vez.
ejemplo:
Consulte el uso adicional en github gist: fuente y prueba
fuente
fuente
Aquí está la versión que funciona para utf-8. csvline2string para una sola línea, sin saltos de línea al final, csv2string para muchas líneas, con saltos de línea:
fuente