📜  pickle — Python对象序列化(1)

📅  最后修改于: 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时需要注意安全问题。以下是一些安全注意事项:

  • 不要从未知或不受信任的源反序列化数据
  • 不要对反序列化的对象执行敏感操作
  • 不要将序列化和反序列化代码用于公开的API