将一个python字典转换为一个string,然后返回
我正在编写一个将数据存储在字典对象中的程序,但是这些数据需要在程序执行过程中的某个时刻保存,并在程序再次运行时加载回字典对象。 如何将字典对象转换成可写入文件并加载回字典对象的string? 这将有望支持包含字典的字典。
json模块在这里是一个很好的解决scheme,它比pickle只有纯文本输出,并且是跨平台和跨版本的优势。
如果你的字典不是太大,也许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来获得额外的安全性。
我使用json
:
import json # convert to string input = json.dumps({'id': id }) # load to dict my_dict = json.loads(input)
在python上处理json很简单
# 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"}')
使用pickle
模块将其保存到磁盘并稍后加载。
如果在中国
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')
我认为你应该考虑使用shelve
模块,它提供了持久的文件支持字典式的对象。 使用“真正的”字典很容易,因为它几乎可以透明地为您的程序提供一些可以像字典一样使用的程序,而无需将其明确地转换为string,然后写入文件(或副本)反之亦然)。
主要的区别是需要在第一次使用之前先open()
,然后在完成时close()
,并根据正在使用的writeback
选项完成(可能sync()
)。 任何“货架”文件对象创build都可以包含常规词典作为值,从而允许它们在逻辑上嵌套。
这是一个简单的例子:
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}
我使用yaml,如果需要可读性(无论是JSON或XML都是恕我直言),或者如果阅读没有必要,我使用泡菜。
写
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
使用传统方法而不是使用简单的库。 这对我有效
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