В 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('""', '"')
testline = testline[1:-1]
Сначала замените двойные двойные кавычки, затем просто уберите первый и последний символы, чтобы удалить начальные и конечные двойные кавычки.
Если вы действительно хотите получить словарный объект, а не строковое представление, то вам следует использовать что-то вроде ast.literal_eval()
загрузить строку как код Python (или json.loads()
загрузить его как JSON).