📅  最后修改于: 2023-12-03 15:03:46.060000             🧑  作者: Mango
pickle
- Python对象序列化pickle
是Python标准库中的一个模块,它可以实现Python对象的序列化和反序列化。所谓序列化,就是将Python对象转换为字节流,而反序列化则是将字节流转换为Python对象。
Python对象序列化的最常用方法是pickle.dump()
,它将一个Python对象序列化,并将结果保存到一个文件中:
import pickle
# 将一个Python对象序列化,并将结果保存到文件中
with open('data.pkl', 'wb') as f:
pickle.dump(obj, f)
# pickle.dump()也可以将结果转换为字节流
bytes_obj = pickle.dumps(obj)
反序列化时,需要使用pickle.load()
从文件中读取数据,或使用pickle.loads()
从字节流中读取数据并转换为Python对象。
import pickle
# 从文件中读取序列化的Python对象
with open('data.pkl', 'rb') as f:
obj = pickle.load(f)
# 将序列化的数据反序列化为Python对象
obj = pickle.loads(bytes_obj)
pickle
可以序列化几乎所有Python对象,包括整数、浮点数、字符串、元组、列表、字典和集合等。下面是一些示例:
import pickle
# 序列化整数、浮点数和字符串
pickle.dumps(42)
pickle.dumps(3.14)
pickle.dumps('Hello, world!')
# 序列化元组
pickle.dumps((1, 2, 3))
# 序列化列表
pickle.dumps([1, 2, 3])
# 序列化字典
pickle.dumps({'apple': 1.0, 'banana': 0.5})
# 序列化集合
pickle.dumps({1, 2, 3})
pickle
可以序列化自定义对象,但需要满足一些条件,即对象必须有以下方法:
__getstate__()
: 返回一个字典,表示对象的状态__setstate__(state: dict)
: 接受一个字典,将对象的状态更新为该字典的值示例:
import pickle
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __getstate__(self):
return {'name': self.name.upper(), 'age': self.age}
def __setstate__(self, state):
self.name = state['name']
self.age = state['age']
p1 = Person('Alice', 20)
# 序列化自定义对象
with open('person.pkl', 'wb') as f:
pickle.dump(p1, f)
# 反序列化自定义对象
with open('person.pkl', 'rb') as f:
p2 = pickle.load(f)
需要注意的是,pickle
可以执行任意代码,因此在使用pickle
时需要注意安全问题。以下是一些安全注意事项: