序列化(json,shelve)

Posted selid

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了序列化(json,shelve)相关的知识,希望对你有一定的参考价值。

 

 


比如,我们在python代码中计算的一个数据需要给另外一段程序使用,那我们怎么给? 现在我们能想到的方法就是存在文件里,然后另一个python程序再从文件里读出来。 但是我们都知道,对于文件来说是没有字典这个概念的,所以我们只能将数据转换成字典放到文件中。 你一定会问,将字典转换成一个字符串很简单,就是str(dic)就可以办到了,为什么我们还要学习序列化模块呢? 没错序列化的过程就是从dic 变成str(dic)的过程。现在你可以通过str(dic),将一个名为dic的字典转换成一个字符串, 但是你要怎么把一个字符串转换成字典呢? 聪明的你肯定想到了eval(),如果我们将一个字符串类型的字典str_dic传给eval,就会得到一个返回的字典类型了。 eval()函数十分强大,但是eval是做什么的?e官方demo解释为:将字符串str当成有效的表达式来求值并返回计算结果。 BUT!强大的函数有代价。安全性是其最大的缺点。 想象一下,如果我们从文件中读出的不是一个数据结构,而是一句"删除文件"类似的破坏性语句,那么后果实在不堪设设想。 而使用eval就要担这个风险。 所以,我们并不推荐用eval方法来进行反序列化操作(将str转换成python中的数据结构) 为什么要有序列化模块

序列化的目的

1、以某种存储形式使自定义对象持久化

2、将对象从一个地方传递到另一个地方。
3、使程序更具维护性。
技术分享图片

json

Json模块提供了四个功能:dumps、dump、loads、load

 

import json
dic = {‘k1‘:‘v1‘,‘k2‘:‘v2‘,‘k3‘:‘v3‘}
str_dic = json.dumps(dic)  #序列化:将一个字典转换成一个字符串
print(type(str_dic),str_dic)  #<class ‘str‘> {"k3": "v3", "k1": "v1", "k2": "v2"}
#注意,json转换完的字符串类型的字典中的字符串是由""表示的
dic2 = json.loads(str_dic)  #反序列化:将一个字符串格式的字典转换成一个字典
#注意,要用json的loads功能处理的字符串类型的字典中的字符串必须由""表示
print(type(dic2),dic2)  #<class ‘dict‘> {‘k1‘: ‘v1‘, ‘k2‘: ‘v2‘, ‘k3‘: ‘v3‘}

list_dic = [1,[‘a‘,‘b‘,‘c‘],3,{‘k1‘:‘v1‘,‘k2‘:‘v2‘}]
str_dic = json.dumps(list_dic) #也可以处理嵌套的数据类型
print(type(str_dic),str_dic) #<class ‘str‘> [1, ["a", "b", "c"], 3, {"k1": "v1", "k2": "v2"}]
list_dic2 = json.loads(str_dic)
print(type(list_dic2),list_dic2) #<class ‘list‘> [1, [‘a‘, ‘b‘, ‘c‘], 3, {‘k1‘: ‘v1‘, ‘k2‘: ‘v2‘}]
loads和dumps
 
技术分享图片
importjsonf=open(json_file,w)dic={k1:v1,k2:v2,k3:v3}json.dump(dic,f)#dump方法接收一个文件句柄,直接将字典转换成json字符串写入文件f.close()f=open(json_file)dic2=json.load(f)#load方法接收一个文件句柄,直接将文件中的json字符串转换成数据结构返回f.close()print(type(dic2),dic2)load和dump
load&dump

 

 ensure_ascii=False关键字使用

import json
f = open(‘file‘,‘w‘)
json.dump({‘国籍‘:‘中国‘},f)
ret = json.dumps({‘国籍‘:‘中国‘})
f.write(ret+‘ ‘)
json.dump({‘国籍‘:‘美国‘},f,ensure_ascii=False)
ret = json.dumps({‘国籍‘:‘美国‘},ensure_ascii=False)
f.write(ret+‘ ‘)
f.close()
ensure_ascii关键字参数




















以上是关于序列化(json,shelve)的主要内容,如果未能解决你的问题,请参考以下文章

python序列化: json & pickle & shelve 模块

python序列化: json & pickle & shelve 模块

模块 序列化 json pickle shelv xml

json模块pickle模块(序列化)shelve模块

第二十天,pickle json xml shelve configparser模块

python序列化:json,pickle,shelve