Python pickle 模块

文摘   科技   2024-10-31 08:08   上海  

点击蓝字,关注山海摸鱼人

目录:

  1. Python的pickle模块简介
  2. pickle模块的 4 个函数
  3. pickle.dumps() 函数
  4. pickle.loads() 函数
  5. pickle.dump() 函数
  6. pickle.load() 函数
  7. 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()函数中的解释。
  • encodingerrors:这两个参数是为了兼容Python 2.x版本,通常在Python 3.x中可以忽略。

pickle.dump() 函数

pickle.dump()函数将一个Python对象序列化并写入到一个打开的文件对象中。

语法格式:
pickle.dump(obj, file, protocol=None, *, fix_imports=True)
参数说明:
  • obj:要序列化的Python对象。
  • file:一个已经打开的文件对象,应该以二进制模式("wb")打开。
  • protocolfix_imports:同dumps()函数中的解释。

pickle.load() 函数

pickle.load()函数从一个包含已序列化Python对象的文件中读取数据,并反序列化得到原始的Python对象。

语法格式:

pickle.load(file, *, fix_imports=True, encoding='ASCII', errors='strict')

参数说明:

  • file:一个已经打开的文件对象,应该以二进制模式("rb")打开。
  • fix_importsencodingerrors:同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对象能够在不同的环境中持久化存储和传输成为可能。

山海摸鱼人
致力于记录美好之瞬间,追寻美好之明天。
 最新文章