如何系统地学习Python(四)标准库(三)

本文详细介绍了Python标准库中用于持久化和压缩的相关模块,包括pickle、shelve、marshal、dbm、sqlite3以及压缩库zlib、gzip、bz2、lzma、zipfile和tarfile的使用方法和示例,帮助开发者更好地管理和处理数据。

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

一、持久化相关

1、pickle:Python对象序列化

pickle是Python的一个标准库,用于对象的序列化和反序列化。所谓序列化,就是将对象转化为可存储或传输的格式(如字节流);反序列化则是将序列化后的对象重新转化为原始的Python对象。

pickle的主要用法如下:

a)序列化:使用pickle.dump()将对象序列化为字节流,并保存到文件中。

import pickle

data = {'name': 'Alice', 'age': 25, 'city': 'New York'}

# 序列化对象并保存到文件中
with open('data.pickle', 'wb') as file:
    pickle.dump(data, file)

b)反序列化:使用pickle.load()从文件中加载字节流,并将其反序列化为Python对象。

import pickle

# 从文件中加载数据并反序列化为对象
with open('data.pickle', 'rb') as file:
    data = pickle.load(file)
    
print(data)  # 输出: {'name': 'Alice', 'age': 25, 'city': 'New York'}

需要注意的是,pickle序列化的对象只能在Python环境中使用。如果需要在不同的语言之间传递数据,可以考虑使用JSON等其他格式。

以下是一个完整的示例,展示了如何使用pickle序列化和反序列化一个自定义的类对象:

import pickle

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

# 创建一个Person对象
person = Person('Alice', 25)

# 序列化对象并保存到文件中
with open('person.pickle', 'wb') as file:
    pickle.dump(person, file)

# 从文件中加载数据并反序列化为对象
with open('person.pickle', 'rb') as file:
    loaded_person = pickle.load(file)

print(loaded_person.name)  # 输出: Alice
print(loaded_person.age)  # 输出: 25

在这个示例中,我们创建了一个名为Person的类,并使用pickle将一个Person对象序列化为字节流并保存到文件中。然后,我们使用pickle.load()从文件中加载数据并将其反序列化为一个新的Person对象。最后,我们访问了反序列化后的对象的属性。

2、copyreg:注册机对pickle的支持函数

copyreg是Python标准库中的一个模块,它提供了一些工具函数,用于将对象的序列化和反序列化操作注册到pickle模块中。copyreg模块对于自定义的类实例的序列化和反序列化非常有用。

copyreg模块主要提供了两个函数:register()和pickle()。

register()函数的语法是:register(type, constructor[, pickle_function [, constructor_args]])。它用于将一个构造函数和一个可选的自定义pickle函数注册给一个对象类型。当使用pickle模块序列化一个类实例时,pickle模块会使用注册的构造函数和pickle函数来序列化和反序列化这个对象。

pickle()函数的语法是:pickle(object)。它用于返回一个可序列化对象的字符串表示。这个字符串可以通过pickle模块的loads()函数反序列化为原始对象。

下面是一个使用copyreg模块的示例:

import copyreg
import pickle

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

def unpickle_person(name, age):
    return Person(name, age)

copyreg.pickle(Person, unpickle_person)

p = Person("Alice", 25)
p_str = pickle.dumps(p)
p_new = pickle.loads(p_str)

print(p_new.name)  # Output: Alice
print(p_new.age)  # Output: 25

在上述示例中,我们定义了一个Person类,它有两个属性:name和age。然后,我们使用register()函数将Person类的构造函数和自定义的unpickle_person()函数注册到pickle模块中。unpickle_person()函数用于根据name和age参数创建一个新的Person对象。

接下来,我们创建了一个Person对象p,并使用pickle()函数将其序列化为字符串表示。然后&

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

runqu

你的鼓励是我创作的最大动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值