Je souhaite diffuser des données comme [1,2,'a','He said "what do you mean?"']
une chaîne au format CSV.
Normalement, on utiliserait csv.writer()
pour cela, car il gère tous les cas extrêmes (virgule, échappement de guillemets, dialectes CSV, etc.) csv.writer()
.
Ma solution actuelle est cette fonction quelque peu piratée:
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 de bord?
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')
StringIO()
est dans laio
bibliothèque.Réponses:
Vous pouvez utiliser à la
StringIO
place du vôtreDummy_Writer
:Il y a aussi
cStringIO
, qui est une version plus rapide de laStringIO
classe.la source
Dans Python 3:
Certains détails doivent être légèrement modifiés pour Python 2:
la source
\n
acceptable d'avoir au milieu des données, mais\r\n
indique la fin d'un enregistrement, peu importe où il apparaît? (En supposant que vous soyez sur une plate-forme qui utilise\r\n
comme terminateur de ligne.)output = StringIO.StringIO()
,io.StringIO()
lèvera TypeError: argument de chaîne attendu, obtenu 'str'.writer.writerow(...)
ligne (unicode argument expected, got 'str'
). Je vais examiner cela.io.BytesIO()
au lieu deio.StringIO()
.J'ai trouvé les réponses, dans l'ensemble, un peu déroutantes. Pour Python 2, cette utilisation a fonctionné pour moi:
la source
puisque j'utilise beaucoup cela pour diffuser les résultats de manière asynchrone de sanic à l'utilisateur en tant que données csv, j'ai écrit l'extrait suivant pour Python 3 .
L'extrait de code vous permet de réutiliser le même tampon StringIo encore et encore.
exemple:
Découvrez d'autres utilisations sur github gist: source et test
la source
la source
Voici la version qui fonctionne pour utf-8. csvline2string pour une seule ligne, sans saut de ligne à la fin, csv2string pour de nombreuses lignes, avec sauts de ligne:
la source