0
点赞
收藏
分享

微信扫一扫

Python 对象的序列和反序列化

Python 对象的序列和反序列化_数据

概念

将对象转换为可保存状态(例如字节流、文本表示等)称为序列化,而反序列化将数据从上述格式转换回对象。

序列化格式会将内存中重建对象所需的所有信息保留在与序列化时相同的状态。

在 Python 中提供了一个 Pickle 模块支持我们的对象数据的序列和反序列化。

存储 Python 原生对象:pickle 模块

Python 带有一个内置包,称为 pickle,pickle 模块能够让我们直接在文件中存储几乎任何 Python 对象的高级工具,同时不需要我们对字符串进行来回转换。它像是超级通用的数据格式化和解析工具。

pickle 包可用于执行 pickling 和 unpickling 操作。Python 中的 pickling 和 unpickling 是用于描述将对象转换为字节流(反之亦然)的过程 - 使用 Python 的 pickle 模块进行序列化和反序列化。

假如有如下的例子:

import pickle

students = {
"Name": ["张三", "法外狂徒", "张麻子"],
"Major": ["社会学", "法律", "经济"]
}

print(students)

运行结果:

{'Name': ['张三', '法外狂徒', '张麻子'], 'Major': ['社会学', '法律', '经济']}

让我们尝试将学生对象“pickle”到二进制文件中。我们可以使用 ​​dump()​​ 函数来做到这一点。它需要两个参数 - 被pickled 的对象和要写入数据的 File 对象。

以下代码将数据 pickle 到一个新文件 stu.txt,该文件将在脚本运行的同一目录中创建:

import pickle

students = {
"Name": ["张三", "法外狂徒", "张麻子"],
"Major": ["社会学", "法律", "经济"]
}

print(students)

stu_file = open('stu.txt', 'wb')
pickle.dump(students, stu_file)
stu_file.close()

运行完后,则会在同目录下多一个 stu.txt 文件,如下:

Python 对象的序列和反序列化_反序列化_02

常规文本编辑器无法查看创建的文件的内容,因为它是二进制数据,并不意味着以人类可读的格式存储。要读取此信息,我们必须解压缩或反序列化此数据。我们可以使用 ​​load()​​ 函数来做到这一点!

load() 函数读取 pickled 文件的内容并返回通过读取数据构造的对象。对象的类型及其状态取决于文件的内容。

由于我们已经保存了一个包含学生姓名和专业的字典:这个具有相同条目的对象被重建。

让我们将刚刚创建的 pickled 文件 stu.txt 读回 Python 对象并打印其内容,新建一个 Python 文件,写入如下代码:

import pickle

stu_file = open("stu.txt", "rb")

stu_data = pickle.load(stu_file)

stu_file.close()

print("学生数据:", stu_data)

运行结果:

$ python3 unpickledtest.py
学生数据: {'Name': ['张三', '法外狂徒', '张麻子'], 'Major': ['社会学', '法律', '经济']}

总结

在本文中,我们了解了 Python 中的 pickling(所谓的对象序列化 object serialization), 和 unpickling (反序列化)操作,这些操作对于存储对象以供以后使用很有用。内置的 pickle 模块提供了诸如 ​​load()​​、​​loads()​​、​​dump()​​、​​dumps()​​ 之类的方法,用于将 Python 对象与字节流之间的相互转换。

参考链接:

  • ​​pickle — Python object serialization — Python 3.10.6 documentation​​
  • ​​Python Pickle | A Comprehensive Guide to Python Pickle (educba.com)​​
  • ​​The Python pickle Module: How to Persist Objects in Python – Real Python​​
举报

相关推荐

0 条评论