¿Cómo puedo unirme a una lista en una cadena (advertencia)?
Pregunta
A lo largo de las líneas de mi anterior pregunta, ¿cómo puedo unirme a una lista de cadenas de caracteres en una cadena tal que los valores de la citada limpiamente.Algo así como:
['a', 'one "two" three', 'foo, bar', """both"'"""]
en:
a, 'one "two" three', "foo, bar", "both\"'"
Sospecho que el módulo csv va a venir a jugar aquí, pero no estoy seguro de cómo obtener el resultado que quiero.
Solución
El uso de la csv
módulo se puede hacer de esa manera:
import csv
writer = csv.writer(open("some.csv", "wb"))
writer.writerow(the_list)
Si usted necesita una cadena solo uso StringIO
instancia como un archivo:
f = StringIO.StringIO()
writer = csv.writer(f)
writer.writerow(the_list)
print f.getvalue()
El resultado: a,"one ""two"" three","foo, bar","both""'"
csv
se escribe de una manera que se puede leer de nuevo más tarde.Puede afinar su salida mediante la definición de un dialect
, establecido quotechar
, escapechar
, etc, según sea necesario:
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()
El resultado: a,one \"two\" three,"foo, bar",both\"'
El mismo dialecto puede ser utilizado con csv módulo para leer la cadena de nuevo más tarde a una lista.
Otros consejos
En una nota relacionada, el de Python builtin codificadores también se puede hacer de la cadena de escapar:
>>> print "that's interesting".encode('string_escape')
that\'s interesting
Aquí es un poco más simple alternativa.
def quote(s):
if "'" in s or '"' in s or "," in str(s):
return repr(s)
return s
Sólo necesitamos cotización de un valor que podría tener comas o cotizaciones.
>>> x= ['a', 'one "two" three', 'foo, bar', 'both"\'']
>>> print ", ".join( map(quote,x) )
a, 'one "two" three', 'foo, bar', 'both"\''