一、序列化模块
序列化:指把python中的数据以文本或二进制的方式进行转换,并且还能反序列化为原来的数据(转成二进制)
为什么需要对数据进行序列化: 数据在程序与网络中进行传输和存储时,需要以更加方便的形式进行操作
主要方法:
- ①二进制序列化模块
pickle
(python专用)- ②文本序列化模块
json
(互联网通用)
与
json
模块的比较:Pickle 协议和 JSON (JavaScript Object Notation) 间有着本质的不同:
- JSON 是一个文本序列化格式(它输出 unicode 文本,尽管在大多数时候它会接着以
utf-8
编码),而 pickle 是一个二进制序列化格式;- JSON 是我们可以直观阅读的,而 pickle 不是;
- JSON是可互操作的,在Python系统之外广泛使用,而pickle则是Python专用的;
- 默认情况下,JSON 只能表示 Python 内置类型的子集,不能表示自定义的类;但 pickle 可以表示大量的 Python 数据类型(可以合理使用 Python 的对象内省功能自动地表示大多数类型,复杂情况可以通过实现 specific object APIs 来解决)。
参见:
json
模块:一个允许JSON序列化和反序列化的标准库模块
1. pickle 序列化
-
dumps() 序列化,可以把一个python的任意对象序列化成为一个二进制
- 返回一个序列化后的二进制数据
pickle.dumps(var)
-
loads() 反序列化,可以把一个序列化后的二进制数据反序列化为python的对象
- 返回一个反序列化后的python对象
-
pickle.dumps(var)
-
dump() 序列化,把一个数据对象进行序列化并写入到文件中
pickle.dump(var,fp)
- 参数1:需要序列化的数据对象
- 参数2:写入的文件对象
-
load() 反序列化,在一个文件中读取序列化的数据,并且完成一个反序列化
- 参数1:读取的文件对象
pickle.load(fp)
举例:
(1)基本的序列化与反序列化操作
vars = 'i love you'
vars = [1,2,3,4]
vars = {
'name':'张三','age':20,'sex':'m'}
# ①使用 pickle.dumps方法 进行序列化成为一个二进制的数据
res = pickle.dumps(vars)
'''
分别返回:
b'\x80\x03X\n\x00\x00\x00i love youq\x00.' <class 'bytes'>
b'\x80\x03]q\x00(K\x01K\x02K\x03K\x04e.' <class 'bytes'>
b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x06\x00\x00\x00\xe5\xbc\xa0\xe4\xb8\x89q\x02X\x03\x00\x00\x00ageq\x03K\x14X\x03\x00\x00\x00sexq\x04X\x01\x00\x00\x00mq\x05u.' <class 'b