Подтвердить что ты не робот

Преобразование строки в dict?

У меня есть script, который изменяет dict на строку и сохраняет ее в файл. Я хотел бы загрузить этот файл и использовать его как dict, но это строка. Есть ли что-то вроде int("7"), которое может изменить строку, отформатированную как dict ({a: 1, b: 2}) в dict? Я пробовал dict(), но это не похоже на то, что он делает. Я слышал о некоторых процессах, связанных с JSON и eval(), но я действительно не вижу, что это делает. Программа загружает те же самые данные, которые она сохраняет, и если кто-то ее редактирует и не работает, это не проблема (мне не нужен какой-либо продвинутый метод подтверждения данных dict или что-то еще).

4b9b3361

Ответ 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}