把对象(或变量)从内存变成可存储或可传输的过程称之为序列化,在python中被称为picking,在其他语言中也被称之为serialization,marshalling,flattening等等,都是一个意思。
序列化的目的:
1、以某种存储形式使自定义对象持久化;
2、将对象从一个地方传递到另一个地方。(方便跨平台数据交互)
3、使程序更具维护性。
模块 | 描述 | 方法 | 作用范围 |
---|---|---|---|
json | 用于实现Python数据类型与通用(json)字符串之间的转换 | dumps()、dump()、loads()、load() | 不能转换自定义类型。明文保存,保密性差 |
pickle | 用于实现Python数据类型与Python特定二进制格式之间的转换 | dumps()、dump()、loads()、load() | 不能用于Python之外 |
shelve | 专门用于将Python数据类型的数据持久化到磁盘,shelve是一个类似dict的对象,操作十分便捷 | open() | 只能用在Python中 |
JSON表示的对象就是标准的JavaScript语言的对象,表示出来就是一个字符串,可以被所有语言读取,也可以方便地存储到磁盘或者通过网络传输,是目前跨平台常用的序列化格式.
import json
#dump方式
dic = {
'name':'jasn','age':18}
json.dump(dic, open('dic.json', 'w', encoding='utf-8'))
# dumps方式
payroll={
'name':'jasn','wage':8900,'Absence':False,'onJob':True}
with open('payroll.json','w', encoding='utf-8')as f:
f.write(json.dumps(payroll))
print(json.dumps(payroll))
'''
dumps和dump 序列化方法
序列化成字符串:json.dumps(json_obj)
序列化字符串到文件中:json.dump(json_obj, write_file)
'''
# 1|json 反序列化
# json类型的字符串不认单引号''
# load方式
re = json.load(open('dic.json','r',encoding='utf-8'))
print(re)
# loads方式
with open('payroll.json','r',encoding='utf-8')as f:
res=json.loads(f.read())
print(res)
pickle模块提供了四个功能:dumps、dump(序列化,存)、loads(反序列化,读)、load (不仅可以序列化字典,列表…可以把python中任意的数据类型序列化)
# pickle.dumps方式
set = {
1,2,3,4,65,756,8754,34,253} # 集合
with open('set1.pkl','wb')as f:
f.write(pickle.dumps(set))
print(pickle.dumps(set))
# pickle.dump方式
set1 = {
1,4,34,253} # 集合
pickle.dump(set1,open('set2.pkl','wb'))
# 2\pickle 反序列化
#==========================================================
#pickle.loads()方法
with open('set1.pkl','rb')as f:
re_pik=pickle.loads(f.read())
print(re_pik)
# pickle.load()方法
re_pik2=pickle.load(open('set2.pkl','rb'))
print(re_pik2)
shelve与pickle类似用来持久化数据的,不过shelve是以键值对的形式,将内存中的数据通过文件持久化,值支持任何pickle支持的python数据格式,它会在目录下生成三个文件。
# shelve也是python提供给我们的序列化工具,比pickle用起来更简单一些。
# shelve只提供给我们一个open方法,是用key来访问的,使用起来和字典类似。
#(1)shelve存入数据
import shelve
f = shelve.open('shelve_file')
f['key'] = {
'int':10, 'float':9.5, 'string':'Sample data'} #直接对文件句柄操作,就可以存入数据
f.close()
#(2)shelve读出数据
import shelve
f1 = shelve.open('shelve_file')
existing = f1['key'] #取出数据的时候也只需要直接用key获取即可,但是如果key不存在会报错
f1.close()
print(existing)
1、JSON只能处理基本数据类型。pickle能处理所有Python的数据类型。
2、JSON用于各种语言之间的字符转换。pickle用于Python程序对象的持久化或者Python程序间对象网络传输,但不同版本的Python序列化可能还有差异。