Come posso unire un elenco in una stringa (avvertenza)?
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.
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"\''