В Python, Как удалить различные нежелательные кавычки в строке, чтобы создать / преобразовать в словарь

У меня есть строка в следующем виде:

testline = "{""key1"": ""value1"", ""key2"": {""value2-subkey1"": ""value2-subvalue2""}}"

Я хотел бы заменить двойные двойные кавычки одинарными двойными кавычками (") и убрать начальную и конечную двойные кавычки, чтобы закончить их словарем.

Пока что у меня есть что-то вроде этого, которое очень не делает то, что я хочу.

import ast
# testline = testline.strip(")
testline = testline.replace('""', '"')
testlinedict = ast.literal_eval(testline)

Это до сих пор дает ValueError: malformed string

Я хочу, чтобы конечный результат был:

testlinedict = {"key1": "value1", "key2": {"value2-subkey1": "value2-subvalue2"}}

3 ответа

Решение

Проблема в том, что двойные кавычки на самом деле интерпретируются Python, но не так, как вы ожидали:

>>> testline = "{""key1"": ""value1"", ""key2"": {""value2-subkey1"": ""value2-subvalue2""}}"
>>> testline
'{key1: value1, key2: {value2-subkey1: value2-subvalue2}}'

Это потому, что в Python, как и в C, несколько строковых литералов, следующих друг за другом, интерпретируются как одна большая строка, поэтому "abc""def" == "abcdef",

Если вы определите testdata правильно, ваше решение работает:

>>> testline = '{""key1"": ""value1"", ""key2"": {""value2-subkey1"": ""value2-subvalue2""}}'
>>> literal_eval(testline.replace('""', '"'))
{'key2': {'value2-subkey1': 'value2-subvalue2'}, 'key1': 'value1'}

Или, если первая и последняя кавычка на самом деле являются частью строки:

>>> testline = '"{""key1"": ""value1"", ""key2"": {""value2-subkey1"": ""value2-subvalue2""}}"'
>>> literal_eval(testline[1:-1].replace('""', '"'))
{'key2': {'value2-subkey1': 'value2-subvalue2'}, 'key1': 'value1'}
testline=testline.replace("\"\"","\"")[1:-1]
testline = testline.replace('""', '"')
testline = testline[1:-1]

Сначала замените двойные двойные кавычки, затем просто уберите первый и последний символы, чтобы удалить начальные и конечные двойные кавычки.

Если вы действительно хотите получить словарный объект, а не строковое представление, то вам следует использовать что-то вроде ast.literal_eval() загрузить строку как код Python (или json.loads() загрузить его как JSON).

Другие вопросы по тегам