一、持久化相关
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()函数将其序列化为字符串表示。然后&