In Python, Wie Sie verschiedene unerwünschte Anführungszeichen in einem string zu erstellen/konvertieren zu einem Wörterbuch
Ich habe einen string in der folgenden form:
testline = "{""key1"": ""value1"", ""key2"": {""value2-subkey1"": ""value2-subvalue2""}}"
Möchte ich ersetzen Sie die doppelten Anführungszeichen mit einem single-double quote (") und die Streifen der ersten und letzten Anführungszeichen zu beenden, mit einem Wörterbuch.
So weit, ich habe etwas, was sehr viel nicht tun, was ich will.
import ast
# testline = testline.strip(")
testline = testline.replace('""', '"')
testlinedict = ast.literal_eval(testline)
So weit dies ergibt ValueError: malformed string
Ich will das Ergebnis:
testlinedict = {"key1": "value1", "key2": {"value2-subkey1": "value2-subvalue2"}}
- das klingt wie, die Sie verwenden möchten
eval
- da haben Sie unerwünschte "" Ihrer Daten, die Sie haben wahrscheinlich nicht genügend Kontrolle über die Daten, und es wäre ein riesiges Sicherheits-Risiko 🙁 .strip()
können entfernen Sie die Zeichen aus dem string nur den ersten und letzten Anführungszeichen sind nicht Teil des string-literal !!!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem ist, dass die Anführungszeichen sind tatsächlich interpretiert von Python, aber nicht so, wie Sie erwartet:
Dies ist, weil in Python wie in C, mehrere string-Literale aufeinander folgenden interpretiert werden als eine große Zeichenfolge, so
"abc""def" == "abcdef"
.Wenn Sie definieren
testdata
richtig, deine Lösung funktioniert:Oder, im Fall der erste und Letzte Zitat sind eigentlich Teil der Zeichenfolge:
Ersetzen, die verdoppelt doublequotes zuerst, dann nehmen Sie einfach aus dem ersten und letzten Zeichen zu entfernen führende und nachfolgende doublequotes.
Wenn Sie wirklich wollen, um wind-up mit einem dictionary-Objekt, anstatt ein string-Darstellung ein, sollten Sie dann so etwas wie
ast.literal_eval()
laden die Zeichenkette als Python-code (oderjson.loads()
zu laden, es als JSON).ast.literal_eval()
oderjson.loads()
zu bauen, ein Wörterbuch aus dem string.testline[1:-1]
? wäre es zu entfernen{
und}
aus dem string-literal"{...}"
"{""key""...
wäre nicht eine gültige string-literal ist. Wenn das nicht der Fall ist, dietestline[1:-1]
Teil entfernt werden kann.testline = testline.replace('""', '"')
gefolgt vontestline = ast.literal_eval(testline)
(NICHT das entfernen der Klammern mittestline = testline[1:-1]
), erhalte ich eineValueError: malformed string
.ValueError: Expecting property name: line 1 column 1 (char 1)
print(testline)
und zu sehen, was das eigentliche Ergebnis ist, bevor Sie versuchen, es zu laden. Sehen, was da schief.