目录:
Python的pickle模块简介 pickle模块的 4 个函数 pickle.dumps()
函数pickle.loads()
函数pickle.dump()
函数pickle.load()
函数pickle 实践示例
Python的pickle模块简介
pickle
模块是Python自带的标准库之一,用于序列化和反序列化Python对象结构。
序列化是指将对象的状态信息转换为可以存储或传输的形式的过程。如果序列化是编码一个Python对象的过程,那么反序列化就是解码某个格式回到它原来的Python对象的过程。
pickle模块的 4 个函数
基于内存的序列化与反序列化
1、pickle.dumps()
:将Python中的对象序列化为一个字节串(即二进制形式),这个字节串可以被存储或者通过网络发送。
2、pickle.loads()
:读取一个给定的字节串,并将其转换回Python对象。
基于文件的序列化与反序列化
3、pickle.dump()
:将Python中的对象序列化为一个字节串(二进制对象),并且把这个字节串写入到一个文件中。
4、pickle.load()
:从一个包含序列化数据的文件中读取数据,并将其转换回Python对象。
注意事项
虽然pickle非常强大,但是也有几点需要注意:
安全性:不应该对不可信源的数据使用pickle反序列化,因为这样做可能会执行恶意代码。
兼容性:不同版本的Python之间可能存在pickle数据的兼容性问题。
性能:对于大量数据,pickle可能不是最快的序列化方案。
pickle.dumps()
函数
pickle.dumps()
函数将一个Python对象转换为一个bytes类型的对象,这个bytes对象包含了原始Python对象的所有信息。这样做的好处是可以将这个bytes对象存储起来,或者通过网络发送出去。
语法格式:
pickle.dumps(obj, protocol=None, *, fix_imports=True)
参数说明:
obj:要序列化的Python对象。 protocol:序列化协议,可选值包括0、1、2、3、4。默认值为3(在Python 3.x中)。较高的协议版本提供了更好的压缩效果。 fix_imports:这是一个关键字参数,默认为True,主要用于Python 2.x到3.x的兼容性处理,通常在Python 3.x中可以忽略。
pickle.loads()
函数
pickle.loads()
函数与dumps()
相反,它的作用是从一个包含已序列化Python对象的bytes对象中恢复出原始的Python对象。
语法格式:
pickle.loads(data, *, fix_imports=True, encoding='ASCII', errors='strict')
参数说明:
data:包含已序列化Python对象的bytes类型数据。 fix_imports:同 dumps()
函数中的解释。encoding 和 errors:这两个参数是为了兼容Python 2.x版本,通常在Python 3.x中可以忽略。
pickle.dump()
函数
pickle.dump()
函数将一个Python对象序列化并写入到一个打开的文件对象中。
语法格式:
pickle.dump(obj, file, protocol=None, *, fix_imports=True)
参数说明:
obj:要序列化的Python对象。 file:一个已经打开的文件对象,应该以二进制模式("wb")打开。 protocol 和 fix_imports:同 dumps()
函数中的解释。
pickle.load()
函数
pickle.load()
函数从一个包含已序列化Python对象的文件中读取数据,并反序列化得到原始的Python对象。
语法格式:
pickle.load(file, *, fix_imports=True, encoding='ASCII', errors='strict')
参数说明:
file:一个已经打开的文件对象,应该以二进制模式("rb")打开。 fix_imports、encoding 和 errors:同 loads()
函数中的解释。
实践示例
让我们通过一个具体的示例来演示这四个函数的实际应用:
import pickle
# 创建一个简单的Python对象
data = {
'name': '山海摸鱼人',
'age': 15,
'is_student': False,
'hobbies': ['coding', 'reading', 'traveling']
}
# 使用pickle.dumps()序列化对象
serialized_data = pickle.dumps(data)
print("\n二进制字节串:", serialized_data)
# 使用pickle.loads()反序列化对象
deserialized_data = pickle.loads(serialized_data)
print("\nPython 对象:", deserialized_data)
# 使用pickle.dump()将对象序列化并写入文件
with open('data.pickle', 'wb') as f:
pickle.dump(data, f)
print("\n二进制字节串写入到文件.")
# 使用pickle.load()从文件中读取并反序列化对象
with open('data.pickle', 'rb') as f:
loaded_data = pickle.load(f)
print("\n读取文件转为Python对象:", loaded_data)
这段代码首先创建了一个Python字典对象,然后使用pickle.dumps()
将其序列化为一个bytes对象。接着使用pickle.loads()
将这个bytes对象反序列化回来。之后,使用pickle.dump()
将同样的对象序列化并保存到一个文件中,最后使用pickle.load()
从这个文件中读取并恢复出原始的Python对象。
通过这样的方式,pickle模块使得Python对象能够在不同的环境中持久化存储和传输成为可能。