Я пишу программу, которая хранит данные в объекте словаря, но эти данные должны быть сохранены в какой-то момент во время выполнения программы и загружены обратно в объект словаря при повторном запуске программы. Как преобразовать объект словаря в строку, которая может быть записана в файл и загружена обратно в объект словаря? Это, надеюсь, поддерживает словари, содержащие словари.
Преобразование python dict в строку и обратно
Ответ 1
Модуль JSON является хорошим решением здесь. Он имеет преимущество перед pickle в том, что он производит только вывод простого текста, а также является кроссплатформенным и кросс-версией.
import json
json.dumps(dict)
Ответ 2
Если ваш словарь не слишком большой, возможно, str + eval может выполнить работу:
dict1 = {'one':1, 'two':2, 'three': {'three.1': 3.1, 'three.2': 3.2 }}
str1 = str(dict1)
dict2 = eval(str1)
print dict1==dict2
Вы можете использовать ast.literal_eval вместо eval для дополнительной безопасности, если источник не доверен.
Ответ 3
Я использую json
:
import json
# convert to string
input = json.dumps({'id': id })
# load to dict
my_dict = json.loads(input)
Ответ 4
Просто получить сделку с json на python
# import built-in json lib
import json
# dict to str
str_json = json.dumps({'my_key': 'my value'})
# str to dict
dict_from_str_json = json.loads('{"my_key": "my value"}')
Ответ 5
Используйте модуль pickle
, чтобы сохранить его на диске и загрузить позже.
Ответ 6
Почему бы не использовать Python 3 встроенных Аста библиотеки функций literal_eval. Лучше использовать literal_eval вместо eval
import ast
str_of_dict = "{'key1': 'key1value', 'key2': 'key2value'}"
ast.literal_eval(str_of_dict)
выдаст вывод как фактический словарь
{'key1': 'key1value', 'key2': 'key2value'}
И если вы хотите преобразовать словарь в строку, как насчет использования str() метода Python.
Предположим, словарь:
my_dict = {'key1': 'key1value', 'key2': 'key2value'}
И это будет сделано так:
str(my_dict)
Напечатает:
"{'key1': 'key1value', 'key2': 'key2value'}"
Это легко, как вам нравится.
Ответ 7
Если в Chinses
import codecs
fout = codecs.open("xxx.json", "w", "utf-8")
dict_to_json = json.dumps({'text':"中文"},ensure_ascii=False,indent=2)
fout.write(dict_to_json + '\n')
Ответ 8
Я думаю, вам стоит подумать об использовании модуля shelve
, который предоставляет постоянные поддерживаемые файлом словарные объекты. Он прост в использовании вместо "реального" словаря, потому что он почти прозрачно предоставляет вашей программе что-то, что можно использовать точно так же, как словарь, без необходимости явно преобразовывать его в строку и затем записывать в файл (или вице- Versa).
Основное отличие состоит в том, чтобы сначала использовать open()
его перед первым использованием, а затем close()
его, когда вы закончите (и, возможно, sync()
его, в зависимости от используемой опции writeback
). Любые создаваемые файловые объекты "полки" могут содержать регулярные словари в качестве значений, позволяя им быть логически вложенными.
Вот тривиальный пример:
import shelve
shelf = shelve.open('mydata') # open for reading and writing, creating if nec
shelf.update({'one':1, 'two':2, 'three': {'three.1': 3.1, 'three.2': 3.2 }})
shelf.close()
shelf = shelve.open('mydata')
print shelf
shelf.close()
Вывод:
{'three': {'three.1': 3.1, 'three.2': 3.2}, 'two': 2, 'one': 1}
Ответ 9
Я использую yaml для этого, если его нужно читать (ни JSON, ни XML не являются IMHO), или если чтение не нужно, я использую pickle.
Запись
from pickle import dumps, loads
x = dict(a=1, b=2)
y = dict(c = x, z=3)
res = dumps(y)
open('/var/tmp/dump.txt', 'w').write(res)
Считывание назад
from pickle import dumps, loads
rev = loads(open('/var/tmp/dump.txt').read())
print rev
Ответ 10
Преобразовать словарь в JSON (строка)
import json
mydict = { "name" : "Don",
"surname" : "Mandol",
"age" : 43}
result = json.dumps(mydict)
print(result[0:20])
получит вас:
{"name": "Don", "sur
Конвертировать строку в словарь
back_to_mydict = json.loads(result)
Ответ 11
Если вам нужна скорость, используйте ujson (UltraJSON), который имеет тот же API, что и json:
import ujson
ujson.dumps([{"key": "value"}, 81, True])
# '[{"key":"value"},81,true]'
ujson.loads("""[{"key": "value"}, 81, true]""")
# [{u'key': u'value'}, 81, True]
Ответ 12
используйте обычные методы, а не библиотеки, которые просты , Это сработало для меня
dict = {'Alice': '2341', 'Beth': '9102', 'Cecil': '3258'}
d=" "
for i in dict:
a=i
b=dict[i]
c=i+":"+dict[i]
d=d+c+'\n'
print d