Quero lançar dados como [1,2,'a','He said "what do you mean?"']
uma string formatada em CSV.
Normalmente seria usado csv.writer()
para isso, porque ele lida com todos os casos extremos malucos (escape de vírgula, escape de aspas, dialetos CSV, etc.) O problema é que csv.writer()
espera a saída para um objeto de arquivo, não para uma string.
Minha solução atual é esta função um tanto 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
Alguém pode dar uma solução mais elegante que ainda lide bem com os casos extremos?
Edit: Veja como acabei fazendo isso:
def csv2string(data):
si = StringIO.StringIO()
cw = csv.writer(si)
cw.writerow(data)
return si.getvalue().strip('\r\n')
StringIO()
está naio
biblioteca.Respostas:
Você pode usar em
StringIO
vez do seuDummy_Writer
:Existe também
cStringIO
, que é uma versão mais rápida daStringIO
aula.fonte
Em Python 3:
Alguns detalhes precisam ser alterados um pouco para o Python 2:
fonte
\n
normal ter no meio dos dados, mas\r\n
indica o fim de um registro, não importa onde ele apareça? (Supondo que você esteja em uma plataforma que usa\r\n
como terminador de linha.)output = StringIO.StringIO()
,io.StringIO()
levantará TypeError: argumento de string esperado, obtido 'str'.writer.writerow(...)
linha (unicode argument expected, got 'str'
). Vou analisar isso.io.BytesIO()
vez deio.StringIO()
.Achei as respostas, no geral, um pouco confusas. Para Python 2, esse uso funcionou para mim:
fonte
como eu uso muito isso para transmitir resultados de forma assíncrona de sanic de volta para o usuário como dados csv, escrevi o seguinte trecho para Python 3 .
O snippet permite reutilizar o mesmo buffer StringIo indefinidamente.
exemplo:
Confira o uso adicional no github gist: fonte e teste
fonte
fonte
Esta é a versão que funciona para utf-8. csvline2string para apenas uma linha, sem quebras de linha no final, csv2string para muitas linhas, com quebras de linha:
fonte