序列化:
把不能够直接存储的数据变成字节流(bytes)保存在文件,
进行持久化存储
反序列化:
把存储的数据(bytes)转化成原本的数据类型,
任何数据都可以转成字节流(bytes)进行存储
只有str有encode, decode
其他类型数据需要pickle
1. dumps
把任意对象序列化
li = [1, 2, 4]
res = pickle.dumps(li)
# 返回bytes
print(res, type(res))
2. loads
把字节流转换为原本的数据
li1 = pickle.loads(res)
# 转换回的数据类型为list
print(li1, type(li1))
3. dump(obj, f)
将数据写入文件
with open('1.txt', 'wb') as f:
li = [1, 2, 4, 5]
# 将li转换成bytes, 使用f句柄写入文件, 没有返回值
pickle.dump(li, f)
4. load(f)
读取写入文件中的字节流数据, 并将其转换成原本的数据
with open('1.txt', 'rb') as f:
res = pickle.load(f)
# 读取f中写入的数据对象, 将bytes转换成原本的数据类型
print(res, type(res))
序列化迭代器
iter1 = iter(range(5))
res = pickle.dumps(iter1)
iter2 = pickle.loads(res)
print(iter2, type(iter2))
多数据对象使用pickle写入文件
li = [1, 2, 4, 5]
tup = (1, 2, 4, 5)
dic = {1:2, 2:3, 4:3}
s = 'abc'
setvar = {1, 2, 4}
with open('2.txt', 'wb') as f:
pickle.dump(li, f)
pickle.dump(tup, f)
pickle.dump(setvar, f)
pickle.dump(dic, f)
pickle.dump(s, f)
with open('2.txt', 'rb') as f:
# f也是一个迭代器,
# load相当于next, 不断调用f
# 返回反序列化后的数据
for i in range(5):
res = pickle.load(f)
print(res, type(res))