✨前言:
🌟什么是pickle?
Python 中的 pickle 模块是一个序列化和反序列化Python对象结构的工具,也就是说它可以把Python中任意一个对象转化为一串字节流,也可以将这串字节流重新恢复为原来的对象。这个过程也分别被称为“pickling”(序列化)和“unpickling”(反序列化)。
🌟使用 pickle 的原因包括:
数据持久化:保存对象状态,以便以后可以重新加载,不需要重复计算。
传输数据:可以将序列化的字节流在网络中传输,或在不同的程序之间共享数据。
缓存:对于耗时的计算结果可以进行缓存,提高程序执行效率。
pickle 的优点有:
Python原生支持,无需额外安装模块。
可以序列化几乎所有的Python数据类型。
使用简单,接口直观。
要注意的是,pickle 也有一些缺点,例如安全性问题(不应对不信任的数据使用pickle进行反序列化)和跨语言通信问题(pickle格式不是通用标准,主要用在Python中)。
🌟下面是 pickle 的基本用法示例:
🌟1.序列化(pickling)到文件
import pickle# 一个示例对象
data = {'a': [1, 2.0, 3, 4+6j],'b': ("character string", b"byte string"),'c': {None, True, False}
}# 序列化到文件
with open('data.pickle', 'wb') as f:pickle.dump(data, f)
🌟2.从文件反序列化(unpickling)
import pickle# 从文件读取数据并反序列化
with open('data.pickle', 'rb') as f:data_loaded = pickle.load(f)print(data_loaded)
# {'a': [1, 2.0, 3, (4+6j)], 'b': ('character string', b'byte string'), 'c': {None, True, False}}
🌟3.序列化到字节流
import pickledata = {'a': [1, 2, 3], 'b': 'string data'}# 序列化为字节流
bytes_data = pickle.dumps(data)print(bytes_data) # 打印序列化后的字节流
🌟4.从字节流反序列化
import pickle# 假设 bytes_data 是已序列化的字节流
bytes_data = b'\x80\x04\x95%\x00\x00\x00\x00\x00\x00\x00}\x94(\x8c\x01a\x94]\x94(K\x01K\x02K\x03e\x8c\x01b\x94\x8c\x0bstring data\x94u.'# 从字节流反序列化
data_loaded = pickle.loads(bytes_data)print(data_loaded)
✨小结:
在使用 pickle 时有几项注意事项:
pickle 使用的是二进制操作,因此读写文件时要使用二进制模式(‘wb’ 或 ‘rb’)。
不同的Python版本中,pickle 序列化的协议可能不同,为了兼容性考虑,可以在 dump() 和 dumps() 函数中指定协议,例如使用protocol=pickle.HIGHEST_PROTOCOL 或 protocol=0。
需要保证序列化和反序列化的环境中具有相同的类和函数定义。
应对 pickle 数据进行校验,不要从不可信的源反序列化数据,以防执行恶意代码。
pickle 是一个强大的序列化工具,但必须小心谨慎地使用,特别是在涉及安全性的场合。在进行跨版本或网络间的数据传输时可能需要考虑使用其他格式如JSON(如果只涉及基础数据类型)或messagepack等更加通用的序列化格式。