本文主要是介绍python3序列化模块之pickle,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
官方文档
简介
pickle 是 Python 中用于对象序列化和反序列化的标准库模块。它可以将 Python 对象转换为字节流,并将其保存到文件或通过网络传输,在需要时再将其恢复为原来的 Python 对象。
模块 pickle 实现了对一个 Python 对象结构的二进制序列化和反序列化。 “pickling” 是将 Python 对象及其所拥有的层次结构转化为一个字节流的过程,而 “unpickling” 是相反的操作,会将(来自一个 binary file 或者 bytes-like object 的)字节流转化回一个对象层次结构。 pickling(和 unpickling)也被称为“序列化”, “编组” 或者 “平面化”。而为了避免混乱,此处采用术语 “封存 (pickling)” 和 “解封 (unpickling)”。
常见用法
保存和加载 Python 对象
保存和加载 Python 函数
def my_function(x):return x * 2with open('function.pkl', 'wb') as f:pickle.dump(my_function, f)with open('function.pkl', 'rb') as f:loaded_function = pickle.load(f)
print(loaded_function(5)) # 输出 10
保存和加载 Python 模块
import my_module
with open('module.pkl', 'wb') as f:pickle.dump(my_module, f)with open('module.pkl', 'rb') as f:loaded_module = pickle.load(f)
print(loaded_module.my_function(5)) # 假设 my_module 有一个 my_function 函数
序列化和反序列化
将对象序列化为字节串:
import pickledata = {'a': 1, 'b': 2, 'c': 3}
serialized_data = pickle.dumps(data)
print(serialized_data) # 输出字节串
从字节串反序列化为对象:
loaded_data = pickle.loads(serialized_data)
print(loaded_data) # 输出 {'a': 1, 'b': 2, 'c': 3}
处理复杂对象
pickle 可以序列化大多数 Python 对象,包括自定义类的实例:
class Person:def __init__(self, name, age):self.name = nameself.age = ageperson = Person('Alice', 30)
with open('person.pkl', 'wb') as f:pickle.dump(person, f)with open('person.pkl', 'rb') as f:loaded_person = pickle.load(f)
print(loaded_person.name, loaded_person.age) # 输出 Alice 30
增强安全性
由于 pickle 反序列化可能存在安全隐患,可以使用 pickle.Unpickler 类来增强安全性:
import pickle
from io import BytesIOclass CustomUnpickler(pickle.Unpickler):def find_class(self, module, name):# 只允许反序列化指定的类if module == 'builtins' and name in ['dict', 'list', 'tuple']:return super().find_class(module, name)raise pickle.UnpicklingError(f"Refused to unpickle class: {module}.{name}")data = b'...' # 从不可信来源获取的序列化数据
bio = BytesIO(data)
unpickler = CustomUnpickler(bio)
try:unpickler.load()
except pickle.UnpicklingError as e:print(f"Error: {e}")
通过网络传输 Python 对象
可以将序列化后的对象通过网络传输,在接收端再反序列化为原对象。这在分布式系统中很有用。
保存复杂的 Python 对象
pickle 可以序列化大多数 Python 对象,包括类实例、函数、模块等。这使得它能够保存和恢复复杂的 Python 数据结构。
实现对象持久化
通过 pickle 可以将 Python 对象保存到文件中,实现对象的持久化存储。这在需要保存程序状态或缓存数据的场景下很有用。
总结
需要注意的是,pickle 模块并不安全,不建议用于处理不可信的数据。因为反序列化的过程可能会执行任意的 Python 代码,存在安全隐患。在使用 pickle 时,应确保数据的来源是可信的。
这篇关于python3序列化模块之pickle的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!