2008-09-23 11 views
6

Sur les lignes de mon précédent question, comment puis-je joindre une liste de chaînes dans une chaîne de sorte que les valeurs soient correctement citées. Quelque chose comme:Comment puis-je joindre une liste dans une chaîne (mise en garde)?

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

dans:

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

Je soupçonne que le module csv entrera en jeu ici, mais je ne suis pas sûr de savoir comment obtenir la sortie que je veux.

Répondre

7

L'utilisation du module csv vous pouvez le faire de cette façon:

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

Si vous avez besoin d'une chaîne il suffit d'utiliser StringIO exemple sous forme de fichier:

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

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

csv écrira d'une manière qu'il peut lire plus tard. Vous pouvez affiner sa production en définissant un dialect, il suffit de définir quotechar, escapechar, etc, au besoin:

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 sortie: a,one \"two\" three,"foo, bar",both\"'

Le même dialecte peut être utilisé avec le module csv pour lire la chaîne revient plus tard à une liste.

1

Voici une alternative légèrement plus simple.

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

Nous avons juste besoin de citer une valeur qui pourrait comporter des virgules ou des guillemets.

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

Sur une note liée, builtin encoders de Python peut aussi faire Escaping string:

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

+1 bien que cela, en soi, est pas ce que je cherchais, je peux voir ce qui est très utile pour moi à un moment donné. –