Python教程:一文了解Python中的序列化与反序列化

目录

1. 序列化与反序列化概述

1.1 什么是序列化?

1.2 什么是反序列化?

1.3 应用场景

2. Python中的序列化与反序列化模块

2.1 pickle模块

2.1.1 使用示例

2.2 json模块

2.2.1 使用示例

2.3 yaml模块

2.3.1 使用示例

2.4 marshal模块

3. 实战案例:配置文件管理

3.1 创建配置管理类

4. 注意事项与常见问题

4.1 安全性问题

4.2 版本兼容性

4.3 性能考虑

4.3.1 序列化速度

4.3.2 序列化后的文件大小

4.3.3 使用场景

Pickle

JSON

4.3.4性能测试示例


在现代编程中,数据的存储与传输占据着重要的地位。Python作为一种流行的编程语言,提供了多种序列化与反序列化(Serialization and Deserialization)的方法。本文将系统地介绍Python中的序列化与反序列化,包括基本概念、常用模块、详细代码示例以及注意事项和常见问题。

1. 序列化与反序列化概述


1.1 什么是序列化?

序列化是将数据结构或对象转换为可以存储或传输的格式的过程。在Python中,序列化通常将对象转换为字节流或字符串,这样可以轻松保存到文件中或通过网络传输。

1.2 什么是反序列化?

反序列化是序列化的逆过程。它将序列化后的数据状态还原为原始对象,以便程序可以再次使用这些数据。

1.3 应用场景

  • 存储配置:将应用程序的配置对象序列化为文件,以便后续加载。
  • 数据传输:在网络传输中,序列化可以将数据以安全的方式发送到另一台机器。
  • 缓存:将计算结果序列化以便快速访问。

2. Python中的序列化与反序列化模块


Python中常用的序列化与反序列化模块有:

  • pickle
  • json
  • yaml
  • marshal

2.1 pickle模块

pickle是Python的内置模块,它可以序列化几乎所有类型的Python对象。

2.1.1 使用示例

import pickle# 创建一个字典对象
data = {'name': 'Alice', 'age': 30, 'city': 'New York'}# 序列化
with open('data.pkl', 'wb') as file:pickle.dump(data, file)# 反序列化
with open('data.pkl', 'rb') as file:loaded_data = pickle.load(file)print(loaded_data)  # 输出: {'name': 'Alice', 'age': 30, 'city': 'New York'}

2.2 json模块

json模块用于处理JSON格式的数据。它适用于轻量级数据交换,且支持跨语言。

2.2.1 使用示例

import json# 创建一个字典对象
data = {'name': 'Alice', 'age': 30, 'city': 'New York'}# 序列化
with open('data.json', 'w') as file:json.dump(data, file)# 反序列化
with open('data.json', 'r') as file:loaded_data = json.load(file)print(loaded_data)  # 输出: {'name': 'Alice', 'age': 30, 'city': 'New York'}

2.3 yaml模块

yaml模块是处理YAML格式的库,YAML格式更加人性化,适合配置文件。

2.3.1 使用示例

import yaml# 创建一个字典对象
data = {'name': 'Alice', 'age': 30, 'city': 'New York'}# 序列化
with open('data.yaml', 'w') as file:yaml.dump(data, file)# 反序列化
with open('data.yaml', 'r') as file:loaded_data = yaml.load(file, Loader=yaml.FullLoader)print(loaded_data)  # 输出: {'name': 'Alice', 'age': 30, 'city': 'New York'}

2.4 marshal模块

marshal用于读写Python的内建数据类型,主要用于Python内部的实现,不推荐用于序列化用户数据。

3. 实战案例:配置文件管理


在实际工作中,配置文件的序列化与反序列化非常常见。我们将创建一个简单的程序来管理应用程序的配置。

3.1 创建配置管理类

import json
import osclass ConfigManager:def __init__(self, config_file='config.json'):self.config_file = config_fileself.config = {}self.load_config()def load_config(self):if os.path.exists(self.config_file):with open(self.config_file, 'r') as file:self.config = json.load(file)else:self.config = {}def save_config(self):with open(self.config_file, 'w') as file:json.dump(self.config, file)def set_value(self, key, value):self.config[key] = valueself.save_config()def get_value(self, key):return self.config.get(key, None)# 使用示例
config = ConfigManager()
config.set_value('app_mode', 'production')
print(config.get_value('app_mode'))  # 输出: 'production'

4. 注意事项与常见问题


4.1 安全性问题

  • 不信任的数据:使用pickle反序列化来自不信任来源的数据可能导致安全风险。尽量使用json或其他安全格式。

4.2 版本兼容性

  • 数据结构变化:在软件迭代过程中,数据结构可能发生变化。在反序列化时,需注意处理旧版本数据的兼容性。

4.3 性能考虑

4.3.1 序列化速度

  • Pickle:在序列化复杂的Python对象(如自定义类、集合等)时,pickle的速度通常较快,因为它直接支持多种Python对象类型,并能够有效地处理复杂的对象图。

  • JSON:在序列化简单数据结构(如字典、列表、基础数据类型)时,json的速度也很快,但对于复杂对象(如自定义类),需要先将其转换为基本的数据结构,这会影响性能。

4.3.2 序列化后的文件大小

  • Pickle:序列化后的数据通常比JSON格式更大。pickle包含了对象的元信息,这使得数据的体积更大,但它能更精确地保留Python对象的类型信息。

  • JSON:生成的文件通常较小,因为它只保留了数据本身,不包含对象类型信息。这使得JSON在存储和传输效率上更具优势,尤其在网络通信中。

4.3.3 使用场景

Pickle
  • 优势

    • 能够序列化几乎所有Python对象,包括自定义类、函数和复杂数据结构。
    • 反序列化后对象的类型和状态完全保留。
  • 劣势

    • 输出的文件通常体积较大。
    • 不安全:反序列化不受信任的数据可能会导致安全风险(执行任意代码)。
    • 仅限于Python,其他语言不易解析。
JSON
  • 优势

    • 输出文件体积较小,易于传输和存储。
    • 格式简单,易于阅读,且人类可读性强。
    • 跨语言支持广泛,几乎所有编程语言都支持JSON格式。
  • 劣势

    • 仅支持基本的数据类型(字符串、数字、布尔值、列表、字典),不支持复合对象和自定义类。
    • 在序列化复杂对象时需要手动转换为基本类型,可能影响性能。

4.3.4性能测试示例

我们可以用以下简单的代码来测试picklejson的序列化和反序列化性能。

import pickle
import json
import time# 创建一个复杂的Python对象
data = {'name': 'Alice','age': 30,'friends': ['Bob', 'Charlie'],'attributes': {'height': 170, 'weight': 65},'is_student': False
}# Pickle性能测试
start_time = time.time()
pickle_data = pickle.dumps(data)
pickle_duration = time.time() - start_timestart_time = time.time()
unpickled_data = pickle.loads(pickle_data)
unpickle_duration = time.time() - start_timeprint(f"Pickle - Serialization time: {pickle_duration:.6f}s, Deserialization time: {unpickle_duration:.6f}s")# JSON性能测试
start_time = time.time()
json_data = json.dumps(data)
json_duration = time.time() - start_timestart_time = time.time()
unjsoned_data = json.loads(json_data)
unjson_duration = time.time() - start_timeprint(f"JSON - Serialization time: {json_duration:.6f}s, Deserialization time: {unjson_duration:.6f}s")
  • 选择Pickle:当你需要序列化复杂的Python对象,且只在Python环境中使用时,pickle是更合适的选择。
  • 选择JSON:当你需要跨语言传输数据或希望保持数据的可读性时,JSON更为合适。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/51217.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第六十二章 定时器按键消抖实验

i.MX8MM处理器采用了先进的14LPCFinFET工艺,提供更快的速度和更高的电源效率;四核Cortex-A53,单核Cortex-M4,多达五个内核 ,主频高达1.8GHz,2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

linux mysql 添加环境变量

要在Linux上添加MySQL的环境变量,可以按照以下步骤进行操作:打开终端窗口。使用文本编辑器(如vi或nano)打开~/.bashrc文件:vi ~/.bashrc或nano ~/.bashrc在文件的末尾添加以下内容:export PATH$PATH:/path/…

shardingsphere的学习(一):shardingsphere的基本概念和水平分表例子

简介 关于shardingsphere的基本相关概念的学习和使用shardingjdbc进行水平分表的例子 shardingsphere 是一套开源的分布式关系型数据库中间件解决方案,由sharding-jdbc,sharding-proxy,sharding-sidecar三个项目组成。 定位为关系型数据库…

日期类的实现(C++实现)

完整呈现 Date.h #include <iostream> using namespace std; //日期类 class Date { public:int GetMonthDays(int year, int month) const;//构造函数Date(int year 0, int month 1, int day 1);//拷贝构造Date(const Date& d);//打印void Print();//析构函数~…

Redis与MySQL数据一致性问题的策略模式及解决方案

目录 一、策略模式 1、旁路缓存模式&#xff08;Cache Aside Pattern&#xff09; 2、读写穿透&#xff08;Read-Through/Write-Through&#xff09; 3、异步缓存写入&#xff08;Write Behind&#xff09; 二、一致性解决方案 1、缓存延迟双删 2、删除重试机制 3、读取…

NodeJS:npm的使用

npm时nodejs的包安装工具 1.查看版本 $ npm -v 9.6.7 2.升级npm $ sudo npm install npm -g 3.安装nodejs模块 $ npm install <Module Name> 通过该方法将在当前目录下创建文件夹node_modules&#xff0c;并将模块安装到node_modules中 可以通过-g参数指定模块为全局安…

Zygote 进程你不知道的东西

一、概述 1.Zygote&#xff08;孵化&#xff09; 进程是所有 Android进程的父进程&#xff0c;包括SystemServer和各种应用进程都是通过Zygote进程fork出来的。Zygote进程相当于Android系统的根进程&#xff0c;系统启动后所有的进程都是通过这个进程fork出来的。这样做的好处…

【python】sklearn基础教程及示例

【python】sklearn基础教程及示例 Scikit-learn&#xff08;简称sklearn&#xff09;是一个非常流行的Python机器学习库&#xff0c;提供了许多常用的机器学习算法和工具。以下是一个基础教程的概述&#xff1a; 1. 安装scikit-learn 首先&#xff0c;确保你已经安装了Python和…

Python:模块导入

step1. 创建一个.py文件&#xff0c;里面装载你想导入的内容 step2. 用import导入 import导入的两种方法 1.整体 import file_name 2.局部 from file_name import function_name 整体的调用&#xff1a; file_name.function() 局部的&#xff1a; function_name() 这是导入的文…

Unity 资源 之 Pop It 3D 解压玩具与双人AI游戏 Unity 资源包分享

精彩呈现&#xff1a;Pop It 3D 解压玩具与双人AI游戏 Unity 资源包分享 一、Pop It 3D 解压玩具的魅力二、双人游戏的互动乐趣三、Unity 游戏资源包的优势四、如何获取资源包 亲爱的游戏爱好者们&#xff0c;今天为大家带来一款令人兴奋的游戏资源——Pop It 3D 解压玩具双人带…

Linux安装Python并运行一个项目

Linux安装Python并运行一个项目 1、下载Python Python版本&#xff1a;3.10.11 操作系统&#xff1a;Centos 8.2 下载地址&#xff1a;https://www.python.org/ftp/python/3.10.11/Python-3.10.11.tar.xz 将文件放在&#xff1a;/opt/python 下 2、安装Python 先安装一些…

数字陷波器的设计和仿真(Matlab+C)

目录 一、数字陷波器的模型 二、Matlab仿真 1. 示例1 2. 示例2 三、C语言仿真 1. 由系统函数计算差分方程 2. 示例代码 一、数字陷波器的模型 二、Matlab仿真 1. 示例1 clear clc f0=100;%滤掉的100Hz fs=1000;%大于两倍的信号最高频率 r=0.9; w0=2*pi*f0/fs;%转换到…

[图解]《分析模式》漫谈19-Midjourney、Sora

1 00:00:02,360 --> 00:00:03,360 今天的漫谈 2 00:00:03,370 --> 00:00:04,560 我们来说一下 3 00:00:04,570 --> 00:00:08,720 人工智能&#xff0c;还是前言 4 00:00:08,890 --> 00:00:11,840 这里有一句话 Kent Beck 5 00:00:12,630 --> 00:00:13,750 W…

Spring Boot配置文件的语法规则

主要介绍两种配置文件的语法和格式&#xff0c;properties和yml 目录 1.配置文件的作用 2.创建配置文件 3.properties语法 4.yml语法 5.配置文件格式 1.配置文件的作用 对于配置文件&#xff0c;也有独立的文件夹去存放&#xff0c;主要用来存放一些需要经过变动的数据&a…

Vue学习(二)计算属性、监视属性、样式绑定

计算属性 定义&#xff1a;如果一个要用的数据&#xff0c;而是由已有的属性&#xff08;data中的属性&#xff09;计算得来&#xff0c;那么可以将其作为计算属性 原理&#xff1a;底层借助了Object.defineproperty方法提供的getter和setter。 计算属性都放在vue实例中的co…

达梦脱机备份报错[-7170]:bakres连接DMAP失败

达梦脱机备份报错[-7170]:bakres连接DMAP失败 [dmdbatest1 ~]$ DmServiceDMSVR01 stop Stopping DmServiceDMSVR01: [ OK ] [dmdbatest1 ~]$ [dmdbatest1 ~]$ dmrman dmrman V8 RMAN> backup database /dm8/data/DM01/dm.ini full; backu…

python绘制方波信号

python绘制方波信号 1、效果 2、导入库 pip install numpy pip install matplotlib3、实现代码 # -*- coding: utf-8 -*-""" @contact: 微信 1257309054 @file: test.py @time: 2024/7/28 14:48 @author: LDC """ import numpy as np import …

IOS-04 Swift 中数组、集合、字典、区间、元组和可选类型

在 Swift 编程语言中&#xff0c;数据结构和类型的合理运用对于高效编程至关重要。接下来&#xff0c;我们将深入探讨数组、集合、字典、区间、元组和可选类型的相关知识。 一、数组&#xff08;Array&#xff09; &#xff08;一&#xff09;元素定义 可以通过多种方式定义数…

Hello 算法:动画图解、一键运行的数据结构与算法教程

Hello 算法 《Hello 算法》是一份开源、免费的数据结构与算法入门教程&#xff0c;特别适合新手。全书采用动画图解&#xff0c;内容清晰易懂&#xff0c;学习曲线平滑&#xff0c;引导初学者探索数据结构与算法的知识地图。源代码可以一键运行&#xff0c;帮助读者通过练习提…

C#中的同步编程和异步编程

1. 简单描述一下同步编程和异步编程 同步编程&#xff1a;按照代码的顺序一行一行执行&#xff0c;如果某个操作需要等待&#xff08;比如读取文件、网络请求、数据库操作等&#xff09;&#xff0c;那么当前的线程就会停下来&#xff0c;一直到这个操作完成了之后&#xff0c…