Python里Dict格式的存储: 转为 json 格式进行读写

前言

Python里字典类型(Dict)的数据进行保存的时候可以用借用pickle序列化的方式,

同时pickle序列化可以保存python里复杂的数据模型, 但缺点是无法用本的记事本打开直观的查看数据内容:

import pickle 
def save_obj(obj, name ):
    with open('obj/'+ name + '.pkl', 'wb') as f:
        pickle.dump(obj, f, pickle.HIGHEST_PROTOCOL)

def load_obj(name ):
    with open('obj/' + name + '.pkl', 'rb') as f:
        return pickle.load(f)

而在Python语言中,json数据与dict字典以及对象之间的转化,是必不可少的操作,
所以我们可以考虑转换成json格式,然后再进行读取保存。

Python json 包里的 dump(),load() , dumps(),loads()

  • json.dumps(): 用于将dict类型的数据转成str
import json

dict = {'a': 'wo', 'b': 'zai', 'c': 'zhe', 'd': 'li'}
string = json.dumps(dict)
print(dict)
print(string)
print(type(dict))
print(type(string))

with open(r'C:\Users\zy\Documents\GitHub\python3\searchTest\json.json','w')as f:
    f.write(string)
1 {'a': 'wo', 'b': 'zai', 'c': 'zhe', 'd': 'li'}
2 {"a": "wo", "b": "zai", "c": "zhe", "d": "li"}
3 
4 

如果没有进行转换,则会报错:TypeError: write() argument must be str, not dict

同时这里要注意, 如果dict中有中文,dump()会输出中文的ascil编码,所以需要将默认参数ensure_ascii = False,同时常见还有参数indent控制输出的str字符之间的间隔大小。

friends={"name":"王虎","name1":"张二","name2":"姚晨"}
print(json.dumps(friends,ensure_ascii=False ,indent =3 )) 
  • json.loads():用于将str类型的数据转成dict:
dict = {'a': 'wo', 'b': 'zai', 'c': 'zhe', 'd': 'li'}
dumps = json.dumps(dict)
loads = json.loads(dumps)

print(dict)
print(dumps)
print(loads)

print(type(dict))
print(type(dumps))
print(type(loads))
{'a': 'wo', 'b': 'zai', 'c': 'zhe', 'd': 'li'}
{"a": "wo", "b": "zai", "c": "zhe", "d": "li"}
{'a': 'wo', 'b': 'zai', 'c': 'zhe', 'd': 'li'}



  • json.dump() 用于将dict类型的数据转成str,并写入到json文件中 , 相当于f.write(json.dumps())
dict = {'a': 'wo', 'b': 'zai', 'c': 'zhe', 'd': 'li'}
json.dump(dict,open(r'C:\Users\zy\Documents\GitHub\python3\searchTest\json.json','w'))
  • json.load() 用于从json文件中读取数据,相当于f.read(json.loads())
filename = (r'C:\Users\zy\Documents\GitHub\python3\searchTest\json.json')
jsObj = json.load(open(filename))
print(jsObj)
print(type(jsObj))
{'a': 'wo', 'b': 'zai', 'c': 'zhe', 'd': 'li'}

你可能感兴趣的:(python语法糖)