pickle 序列化与反序列化

本文通过一个具体的Python代码示例,介绍了如何使用pickle模块实现对象的序列化和反序列化,从而达到对象持久化的目的。示例中创建了一个Person类,包含了姓名、年龄和职业三个属性,并定义了工作方法。在主程序中,创建了一个Person实例,然后使用pickle模块将其保存到文件中,随后再从文件中读取并恢复该对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

废话不多说,直接上代码

import pickle

class Person:
    def __init__(self, name, age, job):
        self.name = name
        self.age = age
        self.job = job

    def work(self):
        print(self.name)
        print(self.age)
        print(self.job)
        print('*'*40)

if __name__ == '__main__':
    a_person = Person('abc', 22, 'waiter')
    with open('person.pkl', 'wb') as f:
        pickle.dump(a_person, f)
        
    with open('person.pkl', 'rb') as f:
        a_person = pickle.load(f)

 

### Python Pickle 序列化反序列化 `pickle` 是 Python 中用于对象序列化反序列化的标准库模块。它允许将复杂的 Python 对象转换为字节流以便存储或传输,并能够从这些字节流重新构建原始对象。 以下是 `pickle` 模块的基本使用方法以及一些示例代码: #### 基本概念 - **序列化**(Serialization):将 Python 对象转换为字节流的过程。 - **反序列化**(Deserialization):将字节流还原为 Python 对象的过程。 #### 示例代码 ##### 使用文件进行序列化反序列化 ```python import pickle # 定义一个要保存的对象 data = { 'name': 'Alice', 'age': 30, 'is_student': False } # 将数据写入文件(序列化) with open('data.pkl', 'wb') as file: pickle.dump(data, file) # 从文件读取数据(反序列化) with open('data.pkl', 'rb') as file: loaded_data = pickle.load(file) print(loaded_data) # 输出 {'name': 'Alice', 'age': 30, 'is_student': False} ``` ##### 字符串形式的序列化反序列化 如果不需要将数据保存到文件中,可以使用字符串来表示序列化后的数据。 ```python import pickle # 要序列化的对象 data = ['apple', 'banana', 'cherry'] # 序列化为字节串 serialized_data = pickle.dumps(data) # 反序列化回原对象 deserialized_data = pickle.loads(serialized_data) print(deserialized_data) # 输出 ['apple', 'banana', 'cherry'] ``` #### 注意事项 - `pickle` 提供了不同的协议版本,默认情况下会使用最新的可用协议[^1]。可以通过参数指定协议版本,例如 `protocol=pickle.HIGHEST_PROTOCOL` 或者 `protocol=0` 表示最兼容但效率较低的二进制格式。 - 不建议在不受信任的数据上执行反序列化操作,因为这可能导致安全漏洞[^2]。 #### 关于容器类的支持 对于自定义类型的对象,`pickle` 同样支持其序列化反序列化过程。例如,在定义了一个带有类型提示的容器类之后,可以直接对其进行处理: ```python from dataclasses import dataclass import pickle @dataclass class ContainerExample: foo: int bar: bool obj = ContainerExample(foo=42, bar=True) # 序列化 serialized_obj = pickle.dumps(obj) # 反序列化 deserialized_obj = pickle.loads(serialized_obj) print(deserialized_obj.foo, deserialized_obj.bar) # 输出 42 True ``` 上述例子展示了如何通过 `pickle` 处理复杂结构的数据,包括用户定义的数据类实例。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值