Python 序列化与反序列化

目录

1、基本概念

2、JSON模块

2.1、dumps() 与 loads() 函数

2.2、dump() 与 load() 函数

2.3、bool 、None 类型的序列化与反序列化

3、pickle模块

3.1、dumps() 与 loads() 函数

3.2、dump() 与 load() 函数

1、基本概念

说明:通过文件操作,可将字符串写入到一个本地文件,但是无法将一个对象,如字典,列表,元组直接写入到一个文件里,这是就需要将这个对象进行序列化,然后写入文件。
序列化:把内存中的数据转换为字节序列,保存到文件。

反序列化:从文件的字节序列恢复到内存中。

类比:字符串与 byte 类型之间互相转换常用的 encode() 函数、与 decode() 函数,分别代表着编码与解码。

Python中可序列化数据类型

  • 可序列化:number、str、list、tuple、dict 字典是最常用的序列化数据类型
  • 不可序列化:class 、def (函数与实例化对象)、set 是无法进行序列化的

在Python中有两个模块可以实现序列化和非序列化,分别是json 和 pickle,下面分别说明两者的使用和区别

2、JSON模块

JSON一种轻量级的数据交换标准,JSON的本质是字符串。也是一个通用的序列化模块,通过它可以完成通用化的序列化与反序列化操作。因为几乎所有的编程语言都有json模块,而且他们序列化与反序列化的规则是统一的。

2.1、dumps() 与 loads() 函数

注意:这两个函数不能直接和文件交互,需要将对象序列化后再写入文件,将原数据从文件中读出后再进行反序列化操作。

示例1:序列化操作

import json

# 定义 整型、字符串、列表、元组、字典 五种数据类型 ,用于序列化测试
int_test = 666
str_test = 'test_string'
list_test = [1, 2, 3]
tuple_test = (4, 5, 6)
dict_test = {'Name': '林一', 'Sex': '男', 'Age': '20'}

int_test_json = json.dumps(int_test)
print(int_test_json) # 666

str_test_json = json.dumps(str_test)
print(str_test_json) # "test_string"

list_test_json = json.dumps(list_test)
print(list_test_json) # [1, 2, 3]

tuple_test_json = json.dumps(tuple_test)
print(tuple_test_json) # [4, 5, 6]

dict_test_json = json.dumps(dict_test)
print(dict_test_json) # {"Name": "\u6797\u4e00", "Sex": "\u7537", "Age": "20"}

从执行结果可以看出字典类型的数据类型,经过序列化后。字典变成了字符串的同时,且字典内的 单引号 变成了 双引号,中文也变成了比特类型,并且进行了 encode 。

示例2:反序列化操作

# 反序列化操作
print(json.loads(int_test_json)) # 666
print(json.loads(str_test_json)) # test_string
print(json.loads(list_test_json)) # [1, 2, 3]
print(json.loads(tuple_test_json)) # [4, 5, 6]
print(json.loads(dict_test_json)) # {'Name': '林一', 'Sex': '男', 'Age': '20'}

注意:元组类型经过序列化处理后再通过反序列化还原数据时,会变为列表数据类型。

  • 这是因为 元组类型 是 python 语言中特有的数据类型,json 作为一个通用格式,无法识别元组类型。所以在针对元组类型进行序列化的时候,会先将 元组类型 ,先转为 列表,再进行序列化处理;同样的在进行反序列化处理时,就会将序列化后的 元组类型 ,又转成了 列表类型 。(类型的转换,不影响对数据的使用)

2.2、dump() 与 load() 函数

作用:可以直接和文件交互

示例1:序列化

dict_test = {"Name": "hello", "Sex": "女", "Age": 18}
with open("json_test.txt", "w") as f:
    json.dump(dict_test, f)

示例2:反序列化

with open("json_test.txt", "r") as f:
    content = json.load(f)
    print(f"文件类型是: {type(content)}, 文件内容为: {content}")

2.3、bool 、None 类型的序列化与反序列化

import json
print("-------------------序列化----------------------------")
print(json.dumps(True)) # true
print(json.dumps(False)) # false
print(json.dumps(None)) # null

print("-------------------反序列化----------------------------")
print(json.loads(json.dumps(True))) # True
print(json.loads(json.dumps(False))) # False
print(json.loads(json.dumps(None))) # None

说明:从上述运行结果来看,bool 类型经过序列化处理后,变成了小写的 true、false;而 None 类型则变成了 小写的 null 。经过反序列化之后,bool、None 类型又被还原成了 python 可读的状态。

注意:大多数的编程语言中, bool 类型都是小写的 true、false 。json 作为一个通用的序列化模块,也同样遵循着这种规则。(小写的 true、false 依然是字符串类型。 )

3、pickle模块

说明:pickle模块与json模块一样可以进行序列化与反序列化,区别在于 pickle 是 Python 内置的序列化模块,它只能用于 python 自身来使用,而json模块更加通用,但pickle模块的性能是要比 json 更好的。所以实际使用根据自身需求选择对应的模块进行使用。

3.1、dumps() 与 loads() 函数

注意:区别于 json 模块,pickle 模块的 dumps() 函数 返回的是 byte 类型 ,而 loads() 函数也仅支持 byte 类型的 pickle 序列进行反序列化的操作。

示例1: 序列化与反序列化

import pickle

# 定义 字符串、元组、字典 三种数据类型 ,用于序列化测试
print("-------------------序列化----------------------------")
str_test = 'test_string'
tuple_test = (4, 5, 6)
dict_test = {'Name': '林一', 'Sex': '男', 'Age': '20'}

str_test_pickle = pickle.dumps(str_test)
print(str_test_pickle)

tuple_test_pickle = pickle.dumps(tuple_test)
print(tuple_test_pickle)

dict_test_pickle = pickle.dumps(dict_test)
print(dict_test_pickle)

print("-------------------反序列化----------------------------")
print(pickle.loads(str_test_pickle))
print(pickle.loads(tuple_test_pickle))
print(pickle.loads(dict_test_pickle))

3.2、dump() 与 load() 函数

作用:dump()函数能一个接着一个地将几个对象序列化存储到同一个文件中,随后调用load()来以同样的顺序反序列化读出这些对象。

参数protocol:是序列化模式,默认是0(ASCII协议,表示以文本的形式进行序列化),protocol的值还可以是1和2(1和2表示以二进制的形式进行序列化。其中,1是老式的二进制协议;2是新二进制协议)。

示例:序列化与反序列化

import pickle
dict_test = {"Name": "hello", "Sex": "女", "Age": 18}
with open("pickle_test.txt", "wb") as f:
    pickle.dump(dict_test, f, 0)

with open("pickle_test.txt", "rb") as f:
    content = pickle.load(f)
    print(f"文件类型是: {type(content)}, 文件内容为: {content}")

注意:

  • 1、由于写入文件和从文件读出都是以二进制的形式,所以,读写是的模式必须是:wb, rb.
  • 2、为避免写入文件的内容乱码,在dump()里加上第三个参数,设为0(ASCII协议).

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

移动硬盘盒支持PD充电:优势解析与实际应用探讨

随着科技的飞速发展,数据存储和传输的需求日益增长,移动硬盘盒作为便携式存储设备的重要载体,其功能和性能也在不断提升。近年来,越来越多的移动硬盘盒开始支持PD(Power Delivery)充电技术,这一…

案例研究|众乐邦将MeterSphere持续测试平台融入DevOps流水线

众乐邦网络科技有限公司(以下简称为“众乐邦”)是一家企业服务公司。其旗下的众乐邦灵活用工数字化薪税管理平台(以下简称为灵活用工管理平台),以财税服务视角切入灵活用工场景,连接企业、灵活就业者和监管…

平台系统的微信支付服务突然不可用问题记录

背景 我们平台系统的微信支付突然不可用,用户点击支付都提示错误“系统繁忙”。 排查 查看日志,发现“支付聚合服务”调用“微信支付服务”的http请求返回read timeout,问题很显然出在“微信支付服务”。http请求报read timeout&#xff0…

全球顶级的低代码开发平台,你知道几个?

什么是低代码开发平台? 低码开发平台是一个应用程序,提供图形用户界面编程,从而以非常快的速度开发代码,减少了传统的编程工作。 这些工具有助于快速开发代码,最大限度地减少手工编码的努力。这些平台不仅有助于编码,而且还能快速安装和部署。 低码开发工具的好处 低代码平…

【JavaSE】你真的了解内部类吗?

前言 本篇会详细讲解内部类的四种形式,让你掌握内部类~ 欢迎关注个人主页:逸狼 创造不易,可以点点赞吗~ 如有错误,欢迎指出~ 目录 前言 内部类介绍 实例内部类 定义 调用 静态内部类 定义 调用 匿名内部类 定义和调用1 调用方法2 …

vs2019 - detected memory leak

文章目录 vs2019 - detected memory leak概述笔记vs2019 consolevs2019 MFC Dlg但是,工程大了之后,VS2019提示的就变了样整好的内存泄漏侦测头文件和实现my_debug_new_define.hmy_debug_new_define.cpp在所有.cpp文件入口处包含my_debug_new_define.h包含…

计算机系列之操作系统的系统

2、大话操作系统的启动 当按下开机键时,BIOS 就会开始执行 ​ BIOS 就是放在主板上 ROM 里面的一段程序。 ​ ROM Read Only Memory(只能读取的内存) ​ 所以 BIOS 在出厂的时候就可以直接写死在 ROM 里面。 ​ 每次开机的时候&#xff…

【数据结构与算法】之双向链表及其实现!

​ 个人主页:秋风起,再归来~ 数据结构与算法 个人格言:悟已往之不谏,知来者犹可追 克心守己,律己则安! 目录 1、双向链表的结构及概念 2、双向链表的实现 2.1 要实现的接口…

Mac版2024 CleanMyMac X 4.15.2 核心功能详解 cleanmymac这个软件怎么样?cleanmymac到底好不好用?

近些年伴随着苹果生态的蓬勃发展,越来越多的用户开始尝试接触Mac电脑。然而很多人上手Mac后会发现,它的使用逻辑与Windows存在很多不同,而且随着使用时间的增加,一些奇奇怪怪的文件也会占据有限的磁盘空间,进而影响使用…

Android studio顶部‘app‘红叉- Moudle ‘XX.app’ dosen’t exist in project

Android studio顶部app红叉- Moudle ‘XX.app’ dosen’t exist in project 1、现象: 运行老项目或者有时候替换项目中的部分代码,明明没有错但是Android studio就编译报错了。 1.1 Android studio顶部app红叉。 1.2 点击Build没有clear菜单&#xff0…

软考 - 系统架构设计师 - 嵌入式真题

问题 1: (1).HTML 静态化:可以实现对系统经常访问的页面进行静态化以提高系统访问的效率,但系统页面通常需要数据库中的用户信息和用户选择来动态显示,因此不适合采用。 HTML 静态化: 将动态生成…

windows下已经创建好了虚拟环境,但是切换不了的解决方法

用得多Ubuntu,今天用Windows重新更新anaconda出问题,重新安装之后,打开pycharm发现打开终端之后,刚开始是ps的状态,后面试了网上改cmd的方法,终端变成c盘开头了 切换到虚拟环境如下:目前的shell…

ON1 NoNoise AI 2024 for Mac/Win:智能降噪,重塑影像之美

在数字摄影领域,图片质量往往受到多种因素的影响,其中噪点问题尤为突出。ON1 NoNoise AI 2024作为一款专为Mac和Windows平台打造的AI图片降噪工具,凭借其卓越的降噪性能和智能化的操作体验,成为了摄影师和图像处理专家们的首选工具…

NL2SQL进阶系列(5):论文解读业界前沿方案(DIN-SQL、C3-SQL、DAIL-SQL、SQL-PaLM)、新一代数据集BIRD-SQL解读

NL2SQL进阶系列(5):论文解读业界前沿方案(DIN-SQL、C3-SQL、DAIL-SQL)、新一代数据集BIRD-SQL解读 NL2SQL基础系列(1):业界顶尖排行榜、权威测评数据集及LLM大模型(Spider vs BIRD)全面对比优劣分析[Text2…

基于Springboot+Vue的Java项目-免税商品优选购物商城系统开发实战(附演示视频+源码+LW)

大家好!我是程序员一帆,感谢您阅读本文,欢迎一键三连哦。 💞当前专栏:Java毕业设计 精彩专栏推荐👇🏻👇🏻👇🏻 🎀 Python毕业设计 &am…

故障转移-redis

4.4.故障转移 集群初识状态是这样的: 其中7001、7002、7003都是master,我们计划让7002宕机。 4.4.1.自动故障转移 当集群中有一个master宕机会发生什么呢? 直接停止一个redis实例,例如7002: redis-cli -p 7002 sh…

Linux环境变量(一)

一.main参数 如果你仔细看过编程书籍就会发现,对于主函数main函数也是有参数的: 首先,我们先来认识两个参数: int main(int argc,char* argv[]) {return 0; } 对于这两个参数:第一个参数int类型表示为第二个的个数…

[C++][算法基础]判定二分图(染色法)

给定一个 n 个点 m 条边的无向图,图中可能存在重边和自环。 请你判断这个图是否是二分图。 输入格式 第一行包含两个整数 n 和 m。 接下来 m 行,每行包含两个整数 u 和 v,表示点 u 和点 v 之间存在一条边。 输出格式 如果给定图是二分图…

字体反爬知识积累2

一、os模块中函数的应用 如何获取当前文件中所有文件的路径方法 这段代码使用 os.walk()函数来遍历指定目录 imgs 下的所有子目录和文件。具体来说,os.walk()函数返回一个生成器,可以在每次迭代中获取目录树中的一个元组,元组包含当前目录的…

【算法】删除链表中重复元素

本题来源---《删除链表中重复元素》。 题目描述 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回已排序的链表 。 示例 1: 输入:head [1,1,2] 输出:[1,2]示例 2: 输入…
最新文章