2008-09-23 9 views
6

A lo largo de las líneas de mi question anterior, ¿cómo puedo unir una lista de cadenas en una cadena para que los valores sean citados limpiamente? Algo así como:¿Cómo puedo unirme a una lista en una cadena (advertencia)?

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

en:

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

sospecho que el módulo csv se pondrá en juego aquí, pero no estoy seguro de cómo obtener la salida que quiero.

Respuesta

7

Con el módulo de csv se puede hacer de esa manera:

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

Si necesita una cadena sólo tiene que utilizar StringIO ejemplo como un archivo:

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

La salida: a,"one ""two"" three","foo, bar","both""'"

csv escribirá de una manera que pueda leer más tarde. Puede afinar su producción mediante la definición de un dialect, acaba de establecer 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() 

La salida: a,one \"two\" three,"foo, bar",both\"'

El mismo dialecto se puede utilizar con el módulo csv para leer la secuencia de regreso más tarde a una lista.

1

Aquí hay una alternativa un poco más simple.

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

Solo debemos indicar un valor que pueda tener comas o comillas.

>>> x= ['a', 'one "two" three', 'foo, bar', 'both"\''] 
>>> print ", ".join(map(quote,x)) 
a, 'one "two" three', 'foo, bar', 'both"\'' 
2

En una nota relacionada, de Python builtin encoders puede también hacer cadena de escape:

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

+1 a pesar de esto, en sí mismo, no es lo que estaba buscando, puedo ver que era muy útil para mí en algún momento. –

Cuestiones relacionadas