pickle序列化与反序列化

时间:2021-04-07
本文章向大家介绍pickle序列化与反序列化,主要包括pickle序列化与反序列化使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

1.序列化和反序列化是什么?

序列化: 把不能够直接存储在文件中的数据变得可存储
反序列化: 把存储在文件中的数据拿出来恢复成原来的数据类型

所有的数据类型都可以通过pickle模块进行序列化.

注意点:

  文件不能直接存储容器,文件只能存储字符串和字节流

dumps 把任意对象序列化成一个bytes(字节流)

示例:

import pickle
lst = [1,2,3]
# 错误案例, 文件不能直接存储容器 , 文件只能存储字符串和字节流
"""
with open("lianxi1.txt",mode="w",encoding="utf-8") as fp:
    fp.write(1)    #error
"""
#dumps 把任意对象序列化成一个bytes
res = pickle.dumps(lst)
print(res , type(res))
结果:
b'\x80\x03]q\x00(K\x01K\x02K\x03e.' <class 'bytes'>

函数可以序列化么? 可以
def func():
print("我是func函数")
res = pickle.dumps(func)
print(res , type(res))
结果:
b'\x80\x03c__main__\nfunc\nq\x00.' <class 'bytes'>

迭代器可以序列化么? 可以
it = iter(range(10))
res = pickle.dumps(it)
print(res , type(res))

结果:

b'\x80\x03cbuiltins\niter\nq\x00cbuiltins\nrange\nq\x01K\x00K\nK\x01\x87q\x02Rq\x03\x85q\x04Rq\x05K\x00b.' <class 'bytes'>

>>> 反序列化loads

#loads 把任意bytes反序列化成原来数据
res2 = pickle.loads(res)
print(res2 , type(res2))

结果:

<range_iterator object at 0x000001C68DBFAED0> <class 'range_iterator'>


#dump 把对象序列化后写入到file-like Object(即文件对象)
lst = [1,2,3]
with open("lianxi1.txt",mode="wb") as fp:
pickle.dump(lst,fp)

#load 把file-like Object(即文件对象)中的内容拿出来,反序列化成原来数据
with open("lianxi1.txt",mode="rb") as fp:
res2 = pickle.load(fp)
print(res2 , type(res2))


# dumps 和 loads 对文件进行写入读取字节流操作
# 写入字节流
with open("lianxi2.txt",mode="wb+") as fp:
res1 = pickle.dumps(lst)
fp.write(res1)

# 读取字节流
with open("lianxi2.txt",mode="rb+") as fp:
bytes_str = fp.read()
res = pickle.loads(bytes_str)
print(res , type(res2))

原文地址:https://www.cnblogs.com/xo1990/p/14629367.html