Python序列化中json模块和pickle模块(详解)

一、什么是序列化?

把对象(或变量)从内存变成可存储或可传输的过程称之为序列化,在python中被称为picking,在其他语言中也被称之为serialization,marshalling,flattening等等,都是一个意思。

二、为什么需要序列化?

序列化的目的:
1、以某种存储形式使自定义对象持久化;
2、将对象从一个地方传递到另一个地方。(方便跨平台数据交互)
3、使程序更具维护性。

在这里插入图片描述

三、什么类型可以序列化?

  1. None,
  2. True, 和 False
  3. 整形、浮点、
  4. 复数 strings, bytes, bytearrays
  5. 元组, 列表, 集合,和 只包含可序列化对象的字典
  6. 定义在模块顶层的函数(lambda表达式不可以)
  7. 定义在模块顶层的内建函数 定义在模块顶层类
    8、 instances of such classes whose dict or the result of calling getstate() is picklable.
    参考博文

四、序列化模块

模块 描述 方法 作用范围
json 用于实现Python数据类型与通用(json)字符串之间的转换 dumps()、dump()、loads()、load() 不能转换自定义类型。明文保存,保密性差
pickle 用于实现Python数据类型与Python特定二进制格式之间的转换 dumps()、dump()、loads()、load() 不能用于Python之外
shelve 专门用于将Python数据类型的数据持久化到磁盘,shelve是一个类似dict的对象,操作十分便捷 open() 只能用在Python中

五、json()方法

JSON表示的对象就是标准的JavaScript语言的对象,表示出来就是一个字符串,可以被所有语言读取,也可以方便地存储到磁盘或者通过网络传输,是目前跨平台常用的序列化格式.

1、JSON和Python内置的数据类型对应如下:

在这里插入图片描述

2、Json序列化示例


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)
'''

3、json反序列化

# 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()方法

pickle模块提供了四个功能:dumps、dump(序列化,存)、loads(反序列化,读)、load (不仅可以序列化字典,列表…可以把python中任意的数据类型序列化)

1、pickle序列化


# 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 反序列化

# 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()方法

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)

8、JSON和pickle的区别

1、JSON只能处理基本数据类型。pickle能处理所有Python的数据类型。
2、JSON用于各种语言之间的字符转换。pickle用于Python程序对象的持久化或者Python程序间对象网络传输,但不同版本的Python序列化可能还有差异。

发布了46 篇原创文章 · 获赞 37 · 访问量 4520

猜你喜欢

转载自blog.csdn.net/weixin_42444693/article/details/104469434