前言
python序列化:
把不能够直接储存的数据变为可储存,这个过程叫序列化。
反序列化:
把存储的数据转化为原数据类型,这个过程叫反序列化。
encode() 和 decode() 的局限性
在python基础函数中,对数据的保存需要将字符串转化为字节流才能保存到文件中。
encode()
将字符串转化为字节流,decode()
将字节流转化为字符串,但都只局限于对字符串进行转化。
res_b = '我爱你'.encode('utf-8')
print(res_b, type(res_b))
res = res_b.decode('utf-8')
print(res, type(res))
# 结果:
# b'\xe6\x88\x91\xe7\x88\xb1\xe4\xbd\xa0' <class 'bytes'>
# 我爱你 <class 'str'>
如果对字符串以外的数据类型调用encode()
和decode()
,则报错。
lst = ['我', '爱', '你']
res = lst.encode('utf-8')
# AttributeError: 'list' object has no attribute 'encode'
pickle模块对数据转换字节流的扩展
pickle
模块解决了encode()
和decode()
的局限性。
pickle
能将不同类型数据转换为字节流保存在文件中,并且读取后能还原为原数据类型,方便对数据的调用。
pickle.dumps(object)
和pickle.loads(byte)
:对数据进行操作。
import pickle
def func1():
print("我爱你")
# 对数据进行操作
res_b = pickle.dumps(func1) # 将数据转换为字节流
print(res_b, type(res_b))
res1 = pickle.loads(res_b) # 将字节流转换回原数据
print(res1, type(res1))
# 结果
# b'\x80\x03c__main__\nfunc1\nq\x00.' <class 'bytes'>
# <function func1 at 0x000001A3E16F2EA0> <class 'function'>
pickle.dump(object, io)
和pickle.load(byte)
:与文件IO的交互操作
import pickle
def func1():
print("我爱你")
# 对文件进行操作
pickle.dump(func1, open('1.txt', 'wb+')) # 转换数据后写进IO流文件中
res2 = pickle.load(open('1.txt', 'rb+')) # 直接读取IO流数据转换为原数据并返回
print(res2, type(res2))
# 结果
# <function func1 at 0x000001A3E16F2EA0> <class 'function'>
json库对pickle模块的扩展
json
是普遍遵守的文件传输格式,而且能将所有基本类型转换为字节流,并且能将字节流还原为原数据类型,继承了pickle
模块所有功能的同时被大众类似协议相互遵守使用。
import json