web-dev-qa-db-fra.com

Comment écrire des données au format CSV sous forme de chaîne (pas de fichier)?

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')
91
Li-aung Yip

Vous pouvez utiliser StringIO au lieu de votre propre Dummy_Writer:

Ce module implémente une classe de type fichier, StringIO, qui lit et écrit un tampon de chaîne (également appelé fichier mémoire).

Il existe également cStringIO , qui est une version plus rapide de la classe StringIO.

54
NPE

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'
127
Tim Pietzcker

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)
5
user2099484

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()
0
bjelli

É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.

0
cowlinator