Je souhaite convertir des données telles que [1,2,'a','He said "what do you mean?"']
Dans une chaîne au format CSV.
Normalement, on utilisera csv.writer()
pour cela, car il gère tous les cas Edge délirants (virgules, guillemets, dialectes CSV, etc.). Le problème est que csv.writer()
attend la sortie à un objet de fichier, pas à une chaîne.
Ma solution actuelle est cette fonction quelque peu 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
Quelqu'un peut-il donner une solution plus élégante qui gère toujours bien les cas Edge?
Edit: Voici comment j'ai fini par le faire:
def csv2string(data):
si = StringIO.StringIO()
cw = csv.writer(si)
cw.writerow(data)
return si.getvalue().strip('\r\n')
Dans Python 3:
>>> import io
>>> import csv
>>> output = io.StringIO()
>>> csvdata = [1,2,'a','He said "what do you mean?"',"Whoa!\nNewlines!"]
>>> writer = csv.writer(output, quoting=csv.QUOTE_NONNUMERIC)
>>> writer.writerow(csvdata)
59
>>> output.getvalue()
'1,2,"a","He said ""what do you mean?""","Whoa!\nNewlines!"\r\n'
Certains détails doivent être légèrement modifiés pour Python 2:
>>> output = io.BytesIO()
>>> writer = csv.writer(output)
>>> writer.writerow(csvdata)
57L
>>> output.getvalue()
'1,2,a,"He said ""what do you mean?""","Whoa!\nNewlines!"\r\n'
J'ai trouvé les réponses, dans l'ensemble, un peu déroutant. Pour Python 2, cet usage a fonctionné pour moi:
import csv, io
def csv2string(data):
si = io.BytesIO()
cw = csv.writer(si)
cw.writerow(data)
return si.getvalue().strip('\r\n')
data=[1,2,'a','He said "what do you mean?"']
print csv2string(data)
Voici la version qui fonctionne pour utf-8. csvline2string pour une seule ligne, sans sauts de ligne à la fin, csv2string pour plusieurs lignes, avec des sauts de ligne:
import csv, io
def csvline2string(one_line_of_data):
si = BytesIO.StringIO()
cw = csv.writer(si)
cw.writerow(one_line_of_data)
return si.getvalue().strip('\r\n')
def csv2string(data):
si = BytesIO.StringIO()
cw = csv.writer(si)
for one_line_of_data in data:
cw.writerow(one_line_of_data)
return si.getvalue()
Étant donné que votre exemple ne comporte qu'une seule ligne de données, vous pouvez simplement utiliser
input = [1,2,'a','He said "what do you mean?"']
output = ",".join(str(x) for x in input)
Évidemment, si les données d'entrée ont une forme plus complexe telle qu'un dictionnaire ou un tableau 2D, cette réponse simple deviendra plus complexe.