Voglio trasmettere dati come [1,2,'a','He said "what do you mean?"']
a una stringa in formato csv.Come posso scrivere i dati in formato csv come stringa (non file)?
Normalmente si potrebbe usare csv.writer()
per questo, perché gestisce tutti i casi limite folli (virgola fuga, segno di citazione in fuga, dialetti CSV, ecc) Il problema è che csv.writer()
prevede di output in un oggetto file, non a un stringa.
mia soluzione attuale è questa funzione un po '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
Qualcuno può dare una soluzione più elegante che gestisce ancora i casi limite bene?
Edit: Ecco come ho finito per farlo:
def csv2string(data):
si = StringIO.StringIO()
cw = csv.writer(si)
cw.writerow(data)
return si.getvalue().strip('\r\n')
Buon esempio. :) Come sidenote, qual è il comportamento normale quando si incontrano nuove righe all'interno di un file CSV? '\ N' ok avere nel mezzo dei dati, ma' \ r \ n' indica la fine di un record, non importa dove appare? (Supponendo che tu sia su una piattaforma che utilizza '\ r \ n' come terminatore di riga.) –
Non sono sicuro. Mi sarei aspettato '\ r \ n' perché il parametro predefinito per' io.StringIO() 'è' newline = None' che abilita la modalità newlines universale, che dovrebbe utilizzare automaticamente lo stile newline corretto in base alla piattaforma. Sono un po 'perplesso da questo comportamento me stesso. –
@ Li-aungYip: ho aperto una [domanda a riguardo] (http://stackoverflow.com/questions/9157623/unexpected-behavior-of-universal-newline-mode-with-stringio-and-csv-modules). –