Quiero transmitir datos como [1,2,'a','He said "what do you mean?"']
a una cadena con formato csv.¿Cómo escribo datos en formato csv como cadena (no archivo)?
Normalmente se usaría csv.writer()
para esto, ya que maneja todos los casos extremos locos (coma escapar, escapar comillas, dialectos CSV, etc.) El problema es que csv.writer()
espera a la salida a un objeto de archivo, no a una cuerda.
Mi solución actual es un poco hacky esta función:
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
Puede alguien dar una solución más elegante que todavía se maneja bien los casos extremos?
Editar: Esto es como terminé haciéndolo:
def csv2string(data):
si = StringIO.StringIO()
cw = csv.writer(si)
cw.writerow(data)
return si.getvalue().strip('\r\n')
Buen ejemplo. :) Como nota al margen, ¿cuál es el comportamiento habitual al encontrar nuevas líneas dentro de un archivo CSV? ¿Está '\ n' bien 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 usa '\ r \ n' como el terminador de línea.) –
No estoy seguro. Hubiera esperado '\ r \ n' yo mismo porque el parámetro predeterminado para' io.StringIO() 'es' newline = None' que habilita el modo de nuevas líneas universales, que debería usar automáticamente el estilo correcto de nueva línea según su plataforma. Estoy confundido por este comportamiento yo mismo. –
@ Li-aungYip: He abierto una [pregunta sobre esto] (http://stackoverflow.com/questions/9157623/unexpected-behavior-of-universal-newline-mode-with-stringio-and-csv-modules) –