pickle模块
【一】什么是pickle模块
- pickle 模块是 Python 内置的一个序列化和反序列化的模块,它可以将 Python 对象转换为字节流,也可以将字节流转换回 Python 对象。
- 这些操作通常被称为序列化和反序列化。
【二】序列化和反序列化
【1】序列化
- 序列化是指将 Python 对象转换为可以存储在文件、数据库或者网络传输的数据格式的过程。
- 序列化后得到的结果通常是字节流形式的数据,这种数据可以方便地进行存储和传输。
【2】反序列化
- 反序列化则是指将字节流形式的数据恢复为原来的 Python 对象的过程。
- 在反序列化过程中,Python 解释器会按照一定的规则解析字节流,并根据字节流的内容创建出与之对应的 Python 对象。
【三】常用的方法介绍
【1】Python对象和pickle对象互转
- pickle 模块提供了一系列的方法和类来实现序列化和反序列化操作。
- 其中最常用的方法是
pickle.dumps()
和 pickle.loads()
。
pickle.dumps()
方法接受一个 Python 对象作为参数,返回一个字节流,表示该对象的序列化结果。
pickle.loads()
方法接受一个字节流作为参数,返回一个 Python 对象,表示该字节流的反序列化结果。
import pickle
# 【一】将Python中的字典类型序列化成pickle的字节流
# 【1】字典类型
user_dict = pickle.dumps({'name': 'dream'})
print(user_dict, type(user_dict))
# b'\x80\x04\x95\x13\x00\x00\x00\x00\x00\x00\x00}\x94\x8c\x04name\x94\x8c\x05dream\x94s.' <class 'bytes'>
# 【2】字符串类型
user_str = pickle.dumps('hello world')
print(user_str, type(user_str))
# b'\x80\x04\x95\x0f\x00\x00\x00\x00\x00\x00\x00\x8c\x0bhello world\x94.' <class 'bytes'>
# 【3】整数类型
user_int = pickle.dumps(123)
print(user_int, type(user_int))
# b'\x80\x04K{.' <class 'bytes'>
# 【4】浮点数类型
user_float = pickle.dumps(3.14)
print(user_float, type(user_float))
# b'\x80\x04\x95\n\x00\x00\x00\x00\x00\x00\x00G@\t\x1e\xb8Q\xeb\x85\x1f.' <class 'bytes'>
# 【5】布尔类型
user_bool = pickle.dumps(True)
print(user_bool, type(user_bool))
# b'\x80\x04\x88.' <class 'bytes'>
# 【6】元组类型
user_tuple = pickle.dumps((1, 2, 3))
print(user_tuple, type(user_tuple))
# b'\x80\x04\x95\t\x00\x00\x00\x00\x00\x00\x00K\x01K\x02K\x03\x87\x94.' <class 'bytes'>
# 【7】列表类型
user_list = pickle.dumps([1, 2, 3])
print(user_list, type(user_list))
# b'\x80\x04\x95\x0b\x00\x00\x00\x00\x00\x00\x00]\x94(K\x01K\x02K\x03e.' <class 'bytes'>
# 【8】集合类型
user_set = pickle.dumps({1, 2, 3})
print(user_set, type(user_set))
# b'\x80\x04\x95\x0b\x00\x00\x00\x00\x00\x00\x00\x8f\x94(K\x01K\x02K\x03\x90.' <class 'bytes'>
【2】Python对象和pickle对象读写
import pickle
class People(object):
def __init__(self, name, age):
self.name = name
self.age = age
def my_func(self):
print(f"我叫{self.name},今年{self.age}岁")
p=People("张三",20)
def save_data(path,data):
with open(path,mode='wb') as f:
pickle.dump(data,f)
def read_data(path):
with open(path,mode='rb') as f:
data=pickle.load(f)
return data
p=People("张三",20)
save_data("user",p)
data=read_data('user')
print(data)#读取对象
print(data.name)
print(data.age)
#<__main__.People object at 0x000001D99DB1CEE0>
#张三
#20
【四】pickle的弊端
- 需要注意的是,pickle 模块并不安全,因为它可以序列化任何 Python 对象,包括内置类型、自定义类的对象等。
- 这使得 pickle 模块有可能成为攻击者攻击的目标。
- 例如,攻击者可以通过构造恶意的 pickle 数据包,将其发送给受害者,导致受害者执行任意代码。
- 因此,如果可能的话,应该尽量避免使用 pickle 模块,或者至少要确保输入的数据来自可信的来源。