Ich habe eine Zeichenfolge, die so aussieht:
"Name1=Value1;Name2=Value2;Name3=Value3"
Gibt es eine integrierte Klasse / Funktion in Python, die diese Zeichenfolge verwendet und ein Wörterbuch erstellt, als hätte ich dies getan:
dict = {
"Name1": "Value1",
"Name2": "Value2",
"Name3": "Value3"
}
Ich habe die verfügbaren Module durchgesehen, kann aber anscheinend nichts Passendes finden.
Danke, ich weiß, wie man den relevanten Code selbst erstellt, aber da solche kleinen Lösungen normalerweise Minenfelder sind, die darauf warten, passiert zu werden (dh jemand schreibt: Name1 = 'Wert1 = 2';) usw., bevorzuge ich normalerweise einige Vorab-Felder getestete Funktion.
Ich mache es dann selbst.
python
string
dictionary
split
Lasse V. Karlsen
quelle
quelle
s = r'Name1='Value=2';Name2=Value2;Name3=Value3;Name4="Va\"lue;\n3"'
Eingabe unterstützen (Hinweis: Ein Semikolon in einer Zeichenfolge in Anführungszeichen, ein Anführungszeichen wird mit einem Backslash maskiert,\n
Escape wird verwendet, einfache und doppelte Anführungszeichen werden verwendet)?Antworten:
Es gibt kein eingebautes, aber Sie können dies ziemlich einfach mit einem Generatorverständnis erreichen:
[Bearbeiten] In Ihrem Update geben Sie an, dass Sie möglicherweise das Zitieren übernehmen müssen. Dies erschwert die Dinge, je nachdem, nach welchem Format Sie genau suchen (welche Anführungszeichen werden akzeptiert, welche Escape-Zeichen usw.). Vielleicht möchten Sie sich das CSV-Modul ansehen, um festzustellen, ob es Ihr Format abdeckt. Hier ein Beispiel: (Beachten Sie, dass die API für dieses Beispiel etwas umständlich ist, da CSV so konzipiert ist, dass es eine Folge von Datensätzen durchläuft, daher die Aufrufe von .next (), die ich mache, um nur die erste Zeile zu betrachten. Anpassen an Ihren Bedürfnissen entsprechen):
Abhängig von der genauen Struktur Ihres Formats müssen Sie möglicherweise jedoch Ihren eigenen einfachen Parser schreiben.
quelle
s = "Name1='Value;2';Name2=Value2;Name3=Value3"
AnführungszeichenName1
. Versuchen Sie Folgendes : (Hinweis: Semikolon im angegebenen Wert).AttributeError: '_csv.reader' object has no attribute 'next'
für mich wirft . Natürlich habe ichimport csv
.Dies kommt dem nahe, was Sie wollten:
quelle
&
oder%
in der Eingabe ist.&
oder%
- zumindest ist es erwähnenswert, dass die Antwort für solche Zeichenfolgen nicht funktioniert.quelle
Dies kann einfach durch String-Join und Listenverständnis erfolgen
",".join(["%s=%s" % x for x in d.items()])
quelle
quelle
s = "Name1='Value1=2';Name2=Value2" and
csv` (wie in Brians akzeptierter Antwort) oderparse_qs
(wie in Kyles), um es richtig zu machen, während Ihr a erhöhtValueError
. Das OP sagt ausdrücklich, "solche kleinen Lösungen sind normalerweise Minenfelder, die darauf warten, passiert zu werden", weshalb er eine integrierte oder eine andere gut getestete Lösung wünscht, und er gibt ein Beispiel, das Ihren Code kaputt macht.s.replace
macht überhaupt nichts; Es wird nur eine neue Zeichenfolge zurückgegeben, die Sie ignorieren. Zweitens, selbst wenn Sie es richtig verstanden haben (s = s.replace…
), das das Problem nicht behebt, fügt es einfach ein neues hinzu. Probieren Sie es entweder an meinem Beispiel oder an den OPs aus.Name='Value1=2';
. Und Ihr Code handhabt es nicht. Und ich bin mir nicht sicher, wie Sie das bereinigen würden, ohne es auf eine Weise zu analysieren, die genauso langsam ist wieurlparse
odercsv
an erster Stelle.Wenn Ihr Wert1, Wert2 nur Platzhalter für tatsächliche Werte sind, können Sie die
dict()
Funktion auch in Kombination mit verwendeneval()
.Dies liegt daran, dass die
dict()
Funktion die Syntax verstehtdict(Name1=1, Name2=2,Name3='string')
. Leerzeichen in der Zeichenfolge (z. B. nach jedem Semikolon) werden ignoriert. Beachten Sie jedoch, dass für die Zeichenfolgenwerte Anführungszeichen erforderlich sind.quelle
s.replace(';'
-basierte Lösung bricht ab, wenn sich;
ein Wert in Anführungszeichen befindet. eval ist böse und in diesem Fall unnötig.