Wie kann ich eine Liste in einen String (caveat) anschließen?
Frage
Nach dem Vorbild meines früheren Frage , wie kann ich eine Liste von Strings in einen String so verbinden, dass die Werte sauber zitiert bekommen. So etwas wie:
['a', 'one "two" three', 'foo, bar', """both"'"""]
in:
a, 'one "two" three', "foo, bar", "both\"'"
Ich vermute, dass der csv-Modul hier ins Spiel kommen, aber ich bin nicht sicher, wie die Ausgabe zu bekommen was ich will.
Lösung
das csv
Modul verwenden, können Sie auf diese Weise tun:
import csv
writer = csv.writer(open("some.csv", "wb"))
writer.writerow(the_list)
Wenn Sie eine Zeichenfolge müssen nur verwenden StringIO
Instanz als Datei:
f = StringIO.StringIO()
writer = csv.writer(f)
writer.writerow(the_list)
print f.getvalue()
Der Ausgang: a,"one ""two"" three","foo, bar","both""'"
csv
wird in einer Art und Weise schreiben Sie es später zurücklesen kann.
Sie können seine Ausgabe Feinabstimmung durch eine dialect
definieren, gerade gesetzt quotechar
, escapechar
, etc., je nach Bedarf:
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()
Der Ausgang: a,one \"two\" three,"foo, bar",both\"'
Der gleiche Dialekt kann mit csv-Modul verwendet werden, um die Zeichenfolge später wieder auf eine Liste zu lesen.
Andere Tipps
Auf einem verwandten beachten, Python gebautet Encoder auch String tun kann entkommen :
>>> print "that's interesting".encode('string_escape')
that\'s interesting
Hier ist eine etwas einfachere Alternative.
def quote(s):
if "'" in s or '"' in s or "," in str(s):
return repr(s)
return s
Wir brauchen nur einen Wert zu zitieren, die Kommas oder Anführungszeichen haben könnte.
>>> x= ['a', 'one "two" three', 'foo, bar', 'both"\'']
>>> print ", ".join( map(quote,x) )
a, 'one "two" three', 'foo, bar', 'both"\''