Domanda

Sulla falsariga del mio precedente domanda , come posso unire un elenco di stringhe in una stringa in modo tale che i valori vengano quotati in modo chiaro. Qualcosa del tipo:

['a', 'one "two" three', 'foo, bar', """both"'"""]

in:

a, 'one "two" three', "foo, bar", "both\"'"

Sospetto che il modulo CSV entrerà in gioco qui, ma non sono sicuro di come ottenere l'output che voglio.

È stato utile?

Soluzione

Usando il modulo csv puoi farlo in questo modo:

import csv
writer = csv.writer(open("some.csv", "wb"))
writer.writerow(the_list)

Se hai bisogno di una stringa usa l'istanza StringIO come file:

f = StringIO.StringIO()
writer = csv.writer(f)
writer.writerow(the_list)
print f.getvalue()

L'output: a, " one " " two " " tre "," pippo, barra "," entrambi "e"; "/ codice"

csv scriverà in un modo che può rileggere in seguito. Puoi ottimizzare il suo output definendo un dialetto , basta impostare quotechar , escapechar , ecc., Se necessario:

class SomeDialect(csv.excel):
    delimiter = ','
    quotechar = '"'
    escapechar = "\\"
    doublequote = False
    lineterminator = '\n'
    quoting = csv.QUOTE_MINIMAL

f = cStringIO.StringIO()
writer = csv.writer(f, dialect=SomeDialect)
writer.writerow(the_list)
print f.getvalue()

L'output: a, one \ " two \ " tre, "pippo, barra", entrambi \ ""

Lo stesso dialetto può essere usato con il modulo CSV per rileggere la stringa in un secondo momento.

Altri suggerimenti

In una nota correlata, encoder integrati di Python può anche eseguire l'escaping delle stringhe :

>>> print "that's interesting".encode('string_escape')
that\'s interesting

Ecco un'alternativa leggermente più semplice.

def quote(s):
    if "'" in s or '"' in s or "," in str(s):
        return repr(s)
    return s

Dobbiamo solo citare un valore che potrebbe contenere virgole o virgolette.

>>> x= ['a', 'one "two" three', 'foo, bar', 'both"\'']
>>> print ", ".join( map(quote,x) )
a, 'one "two" three', 'foo, bar', 'both"\''
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top