- Python 基础
- Python - 首页
- Python - 概述
- Python - 历史
- Python - 特性
- Python vs C++
- Python - Hello World 程序
- Python - 应用领域
- Python - 解释器
- Python - 环境搭建
- Python - 虚拟环境
- Python - 基本语法
- Python - 变量
- Python - 数据类型
- Python - 类型转换
- Python - Unicode 系统
- Python - 字面量
- Python - 运算符
- Python - 算术运算符
- Python - 比较运算符
- Python - 赋值运算符
- Python - 逻辑运算符
- Python - 位运算符
- Python - 成员运算符
- Python - 身份运算符
- Python - 运算符优先级
- Python - 注释
- Python - 用户输入
- Python - 数字
- Python - 布尔值
- Python 控制语句
- Python - 控制流
- Python - 决策制定
- Python - if 语句
- Python - if else
- Python - 嵌套 if
- Python - Match-Case 语句
- Python - 循环
- Python - for 循环
- Python - for-else 循环
- Python - while 循环
- Python - break 语句
- Python - continue 语句
- Python - pass 语句
- Python - 嵌套循环
- Python 函数与模块
- Python - 函数
- Python - 默认参数
- Python - 关键字参数
- Python - 仅限关键字参数
- Python - 位置参数
- Python - 仅限位置参数
- Python - 可变参数
- Python - 变量作用域
- Python - 函数注解
- Python - 模块
- Python - 内置函数
- Python 字符串
- Python - 字符串
- Python - 字符串切片
- Python - 修改字符串
- Python - 字符串连接
- Python - 字符串格式化
- Python - 转义字符
- Python - 字符串方法
- Python - 字符串练习
- Python 列表
- Python - 列表
- Python - 访问列表元素
- Python - 修改列表元素
- Python - 添加列表元素
- Python - 删除列表元素
- Python - 循环遍历列表
- Python - 列表推导式
- Python - 排序列表
- Python - 复制列表
- Python - 合并列表
- Python - 列表方法
- Python - 列表练习
- Python 元组
- Python - 元组
- Python - 访问元组元素
- Python - 更新元组
- Python - 解包元组
- Python - 循环遍历元组
- Python - 合并元组
- Python - 元组方法
- Python - 元组练习
- Python 集合
- Python - 集合
- Python - 访问集合元素
- Python - 添加集合元素
- Python - 删除集合元素
- Python - 循环遍历集合
- Python - 合并集合
- Python - 复制集合
- Python - 集合运算符
- Python - 集合方法
- Python - 集合练习
- Python 字典
- Python - 字典
- Python - 访问字典元素
- Python - 修改字典元素
- Python - 添加字典元素
- Python - 删除字典元素
- Python - 字典视图对象
- Python - 循环遍历字典
- Python - 复制字典
- Python - 嵌套字典
- Python - 字典方法
- Python - 字典练习
- Python 数组
- Python - 数组
- Python - 访问数组元素
- Python - 添加数组元素
- Python - 删除数组元素
- Python - 循环遍历数组
- Python - 复制数组
- Python - 反转数组
- Python - 排序数组
- Python - 合并数组
- Python - 数组方法
- Python - 数组练习
- Python 文件处理
- Python - 文件处理
- Python - 写入文件
- Python - 读取文件
- Python - 重命名和删除文件
- Python - 目录
- Python - 文件方法
- Python - OS 文件/目录方法
- Python - OS 路径方法
- 面向对象编程
- Python - OOPs 概念
- Python - 类与对象
- Python - 类属性
- Python - 类方法
- Python - 静态方法
- Python - 构造函数
- Python - 访问修饰符
- Python - 继承
- Python - 多态
- Python - 方法重写
- Python - 方法重载
- Python - 动态绑定
- Python - 动态类型
- Python - 抽象
- Python - 封装
- Python - 接口
- Python - 包
- Python - 内部类
- Python - 匿名类和对象
- Python - 单例类
- Python - 包装类
- Python - 枚举
- Python - 反射
- Python 错误与异常
- Python - 语法错误
- Python - 异常
- Python - try-except 块
- Python - try-finally 块
- Python - 抛出异常
- Python - 异常链
- Python - 嵌套 try 块
- Python - 用户自定义异常
- Python - 日志记录
- Python - 断言
- Python - 内置异常
- Python 多线程
- Python - 多线程
- Python - 线程生命周期
- Python - 创建线程
- Python - 启动线程
- Python - 加入线程
- Python - 线程命名
- Python - 线程调度
- Python - 线程池
- Python - 主线程
- Python - 线程优先级
- Python - 守护线程
- Python - 线程同步
- Python 同步
- Python - 线程间通信
- Python - 线程死锁
- Python - 中断线程
- Python 网络编程
- Python - 网络编程
- Python - Socket 编程
- Python - URL 处理
- Python - 泛型
- Python 库
- NumPy 教程
- Pandas 教程
- SciPy 教程
- Matplotlib 教程
- Django 教程
- OpenCV 教程
- Python 杂项
- Python - 日期与时间
- Python - 数学
- Python - 迭代器
- Python - 生成器
- Python - 闭包
- Python - 装饰器
- Python - 递归
- Python - 正则表达式
- Python - PIP
- Python - 数据库访问
- Python - 弱引用
- Python - 序列化
- Python - 模板
- Python - 输出格式化
- Python - 性能测量
- Python - 数据压缩
- Python - CGI 编程
- Python - XML 处理
- Python - GUI 编程
- Python - 命令行参数
- Python - 文档字符串
- Python - JSON
- Python - 发送邮件
- Python - 扩展
- Python - 工具/实用程序
- Python - GUIs
- Python 高级概念
- Python - 抽象基类
- Python - 自定义异常
- Python - 高阶函数
- Python - 对象内部
- Python - 内存管理
- Python - 元类
- Python - 使用元类进行元编程
- Python - 模拟和存根
- Python - 猴子补丁
- Python - 信号处理
- Python - 类型提示
- Python - 自动化教程
- Python - Humanize 包
- Python - 上下文管理器
- Python - 协程
- Python - 描述符
- Python - 诊断和修复内存泄漏
- Python - 不可变数据结构
- Python 有用资源
- Python - 问答
- Python - 在线测验
- Python - 快速指南
- Python - 参考
- Python - 速查表
- Python - 项目
- Python - 有用资源
- Python - 讨论
- Python 编译器
- NumPy 编译器
- Matplotlib 编译器
- SciPy 编译器
Python - 序列化
Python中的序列化
序列化是指将对象转换为易于存储、传输或稍后重建的格式的过程。在Python中,这涉及将复杂的数据结构(例如对象或字典)转换为字节流。
我们为什么要使用序列化?
序列化允许数据轻松保存到磁盘或通过网络传输,然后恢复到其原始形式。这对于保存游戏状态、存储用户首选项或在不同系统之间交换数据等任务非常重要。
Python中的序列化库
Python 提供了多个序列化库,每个库都有其自身的优势。以下是Python中一些常用序列化库的详细概述:
Pickle − 这是Python内置的用于序列化和反序列化Python对象的模块。它易于使用,但特定于Python,如果用于不受信任的数据,则可能存在安全隐患。
JSON − JSON(JavaScript 对象表示法)是一种轻量级的数据交换格式,它是人类可读的并且易于解析。它非常适合 Web API 和跨平台通信。
YAML − YAML:(YAML Ain't Markup Language)是一种人类可读的数据序列化标准,易于人类和机器读取和写入。它支持复杂的数据结构,通常用于配置文件。
使用Pickle模块进行序列化
Python 中的 pickle 模块用于序列化和反序列化对象。序列化,也称为 **pickling**,涉及将 Python 对象转换为字节流,然后可以将其存储在文件中或通过网络传输。
反序列化或 **unpickling** 是相反的过程,即将字节流转换回 Python 对象。
序列化对象
我们可以使用 `dump()` 函数序列化对象并将其写入文件。文件必须以二进制写入模式 ('wb') 打开。
示例
在下面的示例中,一个字典被序列化并写入名为“data.pkl”的文件:
import pickle data = {'name': 'Alice', 'age': 30, 'city': 'New York'} # Open a file in binary write mode with open('data.pkl', 'wb') as file: # Serialize the data and write it to the file pickle.dump(data, file) print ("File created!!")
执行上述代码时,字典对象的字节表示将存储在 data.pkl 文件中。
反序列化对象
要反序列化或解包对象,可以使用 `load()` 函数。文件必须以二进制读取模式 ('rb') 打开,如下所示:
import pickle # Open the file in binary read mode with open('data.pkl', 'rb') as file: # Deserialize the data data = pickle.load(file) print(data)
这将从“data.pkl”读取字节流并将其转换回原始字典,如下所示:
{'name': 'Alice', 'age': 30, 'city': 'New York'}
Pickle 协议
协议是用于在将 Python 对象构造/解构为/从二进制数据中使用的约定。
该 `pickle` 模块支持不同的序列化协议,更高的协议通常提供更多功能和更好的性能。目前,`pickle` 模块定义了 6 种不同的协议,如下所示:
序号 | 协议和描述 |
---|---|
1 | 协议版本 0 原始“人类可读”协议,与早期版本向后兼容。 |
2 | 协议版本 1 旧的二进制格式也与早期版本的 Python 兼容。 |
3 | 协议版本 2 在 Python 2.3 中引入,提供对新式类的有效序列化。 |
4 | 协议版本 3 在 Python 3.0 中添加。当需要与其他 Python 3 版本兼容时推荐使用。 |
5 | 协议版本 4 在 Python 3.4 版本中引入。它增加了对超大对象的支持。 |
6 | 协议版本 5 在 Python 3.8 版本中引入。它增加了对带外数据(out-of-band data)的支持。 |
可以通过将其作为参数传递给 `pickle.dump()` 函数来指定协议。
要了解 Python 安装的最高和默认协议版本,可以使用 `pickle` 模块中定义的以下常量:
>>> import pickle >>> pickle.HIGHEST_PROTOCOL 5 >>> pickle.DEFAULT_PROTOCOL 4
Pickler 和 Unpickler 类
Python 中的 `pickle` 模块还定义了 `Pickler` 和 `Unpickler` 类,以便更详细地控制序列化和反序列化过程。“Pickler”类将 pickle 数据写入文件,而“Unpickler”类从文件读取二进制数据并重建原始 Python 对象。
使用 Pickler 类
要使用 Pickler 类序列化 Python 对象,可以按照以下步骤操作:
from pickle import Pickler # Open a file in binary write mode with open("data.txt", "wb") as f: # Create a dictionary dct = {'name': 'Ravi', 'age': 23, 'Gender': 'M', 'marks': 75} # Create a Pickler object and write the dictionary to the file Pickler(f).dump(dct) print ("Success!!")
执行上述代码后,字典对象的字节表示将存储在 "data.txt" 文件中。
使用 Unpickler 类
要使用 Unpickler 类从二进制文件反序列化数据,可以执行以下操作:
from pickle import Unpickler # Open the file in binary read mode with open("data.txt", "rb") as f: # Create an Unpickler object and load the dictionary from the file dct = Unpickler(f).load() # Print the dictionary print(dct)
输出结果如下:
{'name': 'Ravi', 'age': 23, 'Gender': 'M', 'marks': 75}
序列化自定义类对象
pickle 模块还可以序列化和反序列化自定义类。在序列化和反序列化时,必须提供类的定义。
示例
在此示例中,"Person" 类的实例被序列化然后反序列化,从而保持对象的狀態:
import pickle class Person: def __init__(self, name, age, city): self.name = name self.age = age self.city = city # Create an instance of the Person class person = Person('Alice', 30, 'New York') # Serialize the person object with open('person.pkl', 'wb') as file: pickle.dump(person, file) # Deserialize the person object with open('person.pkl', 'rb') as file: person = pickle.load(file) print(person.name, person.age, person.city)
执行上述代码后,输出结果如下:
Alice 30 New York
Python 标准库还包括 `marshal` 模块,该模块用于 Python 对象的内部序列化。与旨在用于通用用途的 pickle 不同,marshal 主要用于 Python 本身(例如,用于编写 .pyc 文件)。
由于 Python 版本之间可能存在兼容性问题,因此通常不建议将其用于通用序列化。
使用 JSON 进行序列化
JSON(JavaScript 对象表示法)是一种流行的数据交换格式。它易于阅读、易于编写且与语言无关,非常适合序列化。
Python 通过 `json` 模块提供对 JSON 的内置支持,该模块允许您将数据序列化和反序列化为 JSON 格式。
序列化
序列化是将 Python 对象转换为 JSON 字符串或将其写入文件的过程。
示例:将数据序列化为 JSON 字符串
在下面的示例中,我们使用 `json.dumps()` 函数将 Python 字典转换为 JSON 字符串:
import json # Create a dictionary data = {"name": "Alice", "age": 25, "city": "San Francisco"} # Serialize the dictionary to a JSON string json_string = json.dumps(data) print(json_string)
上述代码的输出如下:
{"name": "Alice", "age": 25, "city": "San Francisco"}
示例:序列化数据并写入文件
在这里,我们使用 `json.dump()` 函数将序列化的 JSON 数据直接写入文件:
import json # Create a dictionary data = {"name": "Alice", "age": 25, "city": "San Francisco"} # Serialize the dictionary and write it to a file with open("data.json", "w") as f: json.dump(data, f) print ("Success!!")
反序列化
反序列化是将 JSON 字符串转换回 Python 对象或从文件读取它的过程。
示例:反序列化 JSON 字符串
在以下示例中,我们使用 `json.loads()` 函数将 JSON 字符串转换回 Python 字典:
import json # JSON string json_string = '{"name": "Alice", "age": 25, "city": "San Francisco"}' # Deserialize the JSON string into a Python dictionary loaded_data = json.loads(json_string) print(loaded_data)
输出结果如下:
{'name': 'Alice', 'age': 25, 'city': 'San Francisco'}
示例:从文件反序列化数据
在这里,我们使用 `json.load()` 函数从文件读取 JSON 数据并将其转换为 Python 字典:
import json # Open the file and load the JSON data into a Python dictionary with open("data.json", "r") as f: loaded_data = json.load(f) print(loaded_data)
获得的输出如下:
{'name': 'Alice', 'age': 25, 'city': 'San Francisco'}
使用 YAML 进行序列化
YAML(YAML Ain't Markup Language)是一种易于阅读的数据序列化标准,通常用于配置文件和数据交换。
Python 通过 `pyyaml` 包支持 YAML 序列化和反序列化,需要先安装如下所示:
pip install pyyaml
示例:序列化数据并写入 YAML 文件
在下面的示例中,`yaml.dump()` 函数将 Python 字典数据转换为 YAML 字符串并将其写入 "data.yaml" 文件。
`default_flow_style` 参数确保 YAML 输出更易于阅读,并具有扩展格式:
import yaml # Create a Python dictionary data = {"name": "Emily", "age": 35, "city": "Seattle"} # Serialize the dictionary and write it to a YAML file with open("data.yaml", "w") as f: yaml.dump(data, f, default_flow_style=False) print("Success!!")
示例:从 YAML 文件反序列化数据
在这里,`yaml.safe_load()` 函数用于安全地从 "data.yaml" 加载 YAML 数据并将其转换为 Python 字典 (loaded_data):
出于安全原因,建议使用 `safe_load()`,因为它只允许基本 Python 数据类型,并避免从 YAML 文件执行任意代码。
import yaml # Deserialize data from a YAML file with open("data.yaml", "r") as f: loaded_data = yaml.safe_load(f) print(loaded_data)
产生的输出如下所示:
{'age': 35, 'city': 'Seattle', 'name': 'Emily'}