Comment puis-je joindre une liste dans une chaîne (mise en garde)?
Question
Suivant les lignes de mon précédent question , comment puis-je joindre une liste de chaînes dans une chaîne de telle sorte que les valeurs soient correctement citées? Quelque chose comme:
['a', 'one "two" three', 'foo, bar', """both"'"""]
dans:
a, 'one "two" three', "foo, bar", "both\"'"
Je pense que le module csv entrera en jeu ici, mais je ne sais pas comment obtenir le résultat souhaité.
La solution
En utilisant le module csv
, vous pouvez le faire de la manière suivante:
import csv
writer = csv.writer(open("some.csv", "wb"))
writer.writerow(the_list)
Si vous avez besoin d'une chaîne, utilisez simplement l'instance StringIO
en tant que fichier:
f = StringIO.StringIO()
writer = csv.writer(f)
writer.writerow(the_list)
print f.getvalue()
La sortie: a, "un" et "deux". trois "," foo, bar "," les deux "" ""
csv
écrira de manière à pouvoir être lu ultérieurement.
Vous pouvez ajuster sa sortie en définissant un dialecte
, définissez simplement quotechar
, escapechar
, etc., si nécessaire:
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, un \ " deux \ " trois, "foo, bar", les deux "" /
Le même dialecte peut être utilisé avec le module csv pour lire la chaîne ultérieurement dans une liste.
Autres conseils
Sur une note connexe, les codeurs intégrés de Python peuvent également utiliser l'échappement de chaîne. :
>>> print "that's interesting".encode('string_escape')
that\'s interesting
Voici une alternative un peu plus simple.
def quote(s):
if "'" in s or '"' in s or "," in str(s):
return repr(s)
return s
Il suffit de citer une valeur pouvant 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"\''