详解Python3 pickle模块用法
简介
pickle
模块是 Python 中的一个标准库,用来序列化和反序列化 Python 对象。简单来说,pickle
可以将 Python 对象转化为二进制格式,这样可以在不同的程序之间传递数据或者将数据存储到磁盘中,使得这些数据保持其原本的数据类型和结构。
支持的数据类型
在使用 pickle
时需要知道,它支持处理的 Python 数据类型如下:
- 基本数据类型:
int
,float
,complex
,str
,bytes
- 组合数据类型:
list
,tuple
,set
,dict
- 自定义类、函数(不支持 lambda 函数)
序列化对象
pickle
库提供了 dump
和 dumps
两个方法来序列化 Python 对象,二者的区别在于前者将序列化的对象保存到文件中,而后者将序列化的对象保存到一个 Byte 字符串中。
import pickle
# 序列化一个简单的对象
data = [1, 2, 3, 4, 5]
with open('data.pkl', 'wb') as f:
pickle.dump(data, f)
# 将序列化的对象保存到一个 Byte 字符串中
data_str = pickle.dumps(data)
以上代码中,先定义了一个列表对象,然后使用 pickle.dump
方法将 data
序列化并保存到文件 data.pkl
中,使用 pickle.dumps
方法将 data
序列化并保存到一个 Byte 字符串中。
反序列化对象
与序列化相对应,pickle
库也提供了 load
和 loads
两个方法来反序列化 Python 对象。二者的区别在于前者从文件中加载序列化的对象,而后者从一个 Byte 字符串中加载序列化的对象。
import pickle
# 从文件中加载序列化的对象
with open('data.pkl', 'rb') as f:
data = pickle.load(f)
print(data)
# 从 Byte 字符串中加载序列化的对象
data_str = b'\x80\x04\x95\x0f\x00\x00\x00\x00\x00\x00\x00]\x94(K\x01K\x02K\x03K\x04K\x05e.'
data = pickle.loads(data_str)
print(data)
以上代码中,先使用 pickle.load
方法从文件 data.pkl
中加载序列化的对象,在屏幕输出加载结果;然后使用 pickle.loads
方法从一个 Byte 字符串中加载序列化的对象,在屏幕输出加载结果。
注意
使用 pickle
库时,需要注意以下几点:
- 不要对不信任的数据使用
pickle.load
,因为其可能会执行恶意代码。 - 序列化的数据跨 Python 版本、操作系统、CPU 架构时,可能会出现不兼容问题。
pickle
序列化的数据大小通常比 JSON 格式的数据大。- 序列化的数据也可以使用压缩算法来减小其大小,例如 gzip、bz2 等。
示例
下面通过两个示例,来展示 pickle
的具体用法。
示例 1
import pickle
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return f"Person(name='{self.name}', age={self.age})"
person1 = Person('Tom', 23)
# 把 person1 序列化保存到文件 pers.p
with open('pers.p', 'wb') as f:
pickle.dump(person1, f)
# 从 pers.p 中读取序列化的 Person 对象并反序列化
with open('pers.p', 'rb') as f:
person2 = pickle.load(f)
print(person2)
以上示例中,首先定义了一个 Person
类,接着创建了一个类的实例 person1
,并使用 pickle.dump
方法将其序列化保存到文件 pers.p
中。接着使用 pickle.load
方法读取文件 pers.p
中序列化的数据并反序列化成 Python 对象 person2
,最后输出 person2
的信息。
示例 2
import pickle
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(3)
root.left.left = TreeNode(4)
root.left.right = TreeNode(5)
# 把二叉树序列化保存到文件 tree.p
with open('tree.p', 'wb') as f:
pickle.dump(root, f)
# 从 tree.p 中读取序列化的二叉树并反序列化
with open('tree.p', 'rb') as f:
root_new = pickle.load(f)
print(root_new.val)
print(root_new.left.val)
print(root_new.right.val)
print(root_new.left.left.val)
print(root_new.left.right.val)
以上示例中,首先定义了一个 TreeNode
类表示二叉树的节点,并创建了一个二叉树并使用 pickle.dump
方法将其序列化保存到文件 tree.p
中。接着使用 pickle.load
方法读取文件 tree.p
中序列化的数据并反序列化成 Python 对象 root_new
,最后输出 root_new
中的节点信息。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Python3 pickle模块用法 - Python技术站