У меня есть script, который изменяет dict на строку и сохраняет ее в файл. Я хотел бы загрузить этот файл и использовать его как dict, но это строка. Есть ли что-то вроде int("7")
, которое может изменить строку, отформатированную как dict ({a: 1, b: 2}
) в dict? Я пробовал dict()
, но это не похоже на то, что он делает. Я слышал о некоторых процессах, связанных с JSON и eval()
, но я действительно не вижу, что это делает. Программа загружает те же самые данные, которые она сохраняет, и если кто-то ее редактирует и не работает, это не проблема (мне не нужен какой-либо продвинутый метод подтверждения данных dict или что-то еще).
Преобразование строки в dict?
Ответ 1
Попробуйте это, это самый безопасный способ:
import ast
ast.literal_eval("{'x':1, 'y':2}")
=> {'y': 2, 'x': 1}
Все решения, основанные на eval()
, опасны, вредоносный код может быть введен внутри строки и выполнен.
В соответствии с документацией выражение оценивается безопасно. Кроме того, в соответствии с исходный код, literal_eval
анализирует строку на Python AST (исходное дерево) и возвращает только в том случае, если она является литералом, Код никогда не выполняется, только анализируется, поэтому нет причин для его риска.
Ответ 2
Этот формат не JSON, а YAML, который вы можете анализировать с помощью PyYAML:
>>> import yaml
>>> s = '{a: 1, b: 2}'
>>> d = yaml.load(s)
>>> d
{'a': 1, 'b': 2}
>>> type(d)
<type 'dict'>
Ответ 3
Вы можете использовать eval
, если вы доверяете входной строке.
>>> a=eval('{"a":1,"b":2}')
>>> a
{'a': 1, 'b': 2}
Ответ 4
Сериализация
То, о чем вы говорите, это сериализация объектов, и есть лучшие способы сделать это, чем переносить свой собственный метод сериализации (хотя вы, похоже, чтобы придумать YAML). Оба они по-прежнему менее безопасны, чем подход ast.literal_eval()
(особенно, pickle
), но их здесь следует отметить.
JSON
Вот пример того, что вы хотите использовать JSON, популярный формат перекрестного языка:
import json
myDict = {'a':1, 'b':2}
# write to the file 'data'
with open('data','w') as f:
json.dump(myDict, f)
# now we can load it back
with open('data','r') as f:
myDictLoaded = json.load(f)
print myDictLoaded
Вывод:
{u'a': 1, u'b': 2}
рассол
Вот второй пример, делающий то же самое, используя pickle. pickle
более мощный, поскольку он может сериализовать все * объекты python, даже те, которые вы пишете.
import cPickle as pickle
myDict = {'a':1, 'b':2}
# write to the file 'data'
with open('data','w') as f:
pickle.dump(myDict, f)
# now we can load it back
with open('data','r') as f:
myDictLoaded = pickle.load(f)
print myDictLoaded
Вывод:
{'a': 1, 'b': 2}