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) # 666str_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)) # nullprint("-------------------反序列化----------------------------")
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.mzph.cn/news/808893.shtml

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

相关文章

个人博客系统项目(SpringBoot+Linux部署上线)

在学完SpringBoot框架、MyBatis后,直接开始做第一个项目:博客系统 首先,该博客系统包含核心功能有: 一、登录、注册、退出登录功能。 二、没有登陆前可以查看博客首页以及博客展示的分页处理,以及点击查看博客可以…

浅谈网络安全威胁与防御策略

企业网络安全威胁概述 外部威胁:来自网络安全威胁,比如DDOS攻击,病毒,sql注入,木马,蠕虫,等网络入侵,网络扫描,垃圾邮件,钓鱼邮件,针对web的攻击…

集合系列(十九) -List与数组互转操作介绍

一、数组转List 方式一 通过 Arrays.asList(strArray) 方式,将数组转换List,但不能对List增删,只能查改,否则抛异常,例子如下: public static void main(String[] args) {//创建一个字符串数组String[] …

小程序中配置scss

找到:project.config.json 文件 setting 模块下添加: "useCompilerPlugins": ["sass","其他的样式类型"] 配置完成后,重启开发工具,并新建文件 结果:

微信小程序自定义关闭按钮在弹窗下面的效果

效果图: 我之前用vant 的popup的弹窗写,会出现close图标移动到弹窗内容外部不可见。 自定义代码: popup.JS/*** 生命周期函数--监听页面初次渲染完成*/onReady() {//自定义弹窗 动态获取屏幕高度var that this;wx.getSystemInfo({success: (result) &…

探探各个微前端框架

本文作者为 360 奇舞团前端开发工程师 微前端架构是为了在解决单体应用在一个相对长的时间跨度下,由于参与的人员、团队的增多、变迁,从一个普通应用演变成一个巨石应用(Frontend Monolith)后,随之而来的应用不可维护的问题。这类问题在企业级…

【ELFK】Filebeat+ELK 部署

FilebeatELK 部署 Node1节点(2C/4G):node1/192.168.67.11 Elasticsearch Kibana Node2节点(2C/4G):node2/192.168.67.12 Elasticsearch Apache节点:apache/192.168.67.10 …

linux学习:队列

目录 顺序队列 管理结构体设计 初始化 入队 出队 链式队列 例子 用户输入整数则入队,字母则出队 我们对队列里的元素操作是有严格限制的:插入一个新节点,必须插入到 指定的一端,而删除一个已有节点,则必须在另…

掌握 C# 爬虫技术:使用 HttpClient 获取今日头条内容

摘要/导言: 在本文中,我们将探讨如何使用 C# 中的 HttpClient 类和爬虫代理IP技术来获取今日头条的内容。我们还将实现多线程技术,以提高数据采集的效率。 背景/引言: 随着信息时代的到来,数据已经成为了一种非常宝…

开发日志2024-04-11

开发日志2024/04/11 1、会员/普通用户预约完成后,技师对应的积分添加预约完成的项目价格添加到统计表的业绩字段中,同时对应的服务次数字段1 实现代码: 前端 shHandler(){this.$confirm(确定操作?, "提示", {confirmButtonText…

HarmonyOS实战开发-拼图、如何实现获取图片,以及图片裁剪分割的功能。

介绍 该示例通过ohos.multimedia.image和ohos.multimedia.mediaLibrary接口实现获取图片,以及图片裁剪分割的功能。 效果预览 使用说明: 使用预置相机拍照后启动应用,应用首页会读取设备内的图片文件并展示获取到的第一个图片,…

word中插入mathtype版的符号后,行间距变大解决方法

问题 解决方法 选中该段,设置固定值行距。如果是宋体,小四,1.25行距,那么固定值就为20磅。 成功解决。

ELK 企业级日志分析 ELFK

一 ELK 简介 ELK平台是一套完整的日志集中处理解决方案,将 ElasticSearch、Logstash 和 Kiabana 三个开源 工具配合使用, 完成更强大的用户对日志的查询、排序、统计需求。 1 ElasticSearch: 是基于Lucene(一个全文检索引擎的…

Java后端基础知识(String类型)

String类的创建方式 String的特点 1.引用数据类型 2.是final类,一旦创建内容不可修改 3.String类对象相等的判断用equals()方法完成,是判断地址数值 String的创建方式 1.直接创建 String str"hello";注意&#xff…

09 Php学习:数组和排序

数组概念 在PHP中,数组是一种复合数据类型,用于存储多个值。以下是关于PHP数组的详细解释: 索引数组:索引数组是最基本的数组类型,其中每个元素都有一个唯一的数字索引,从0开始递增。 关联数组&#xff…

Android Studio开发学习(七)———RelativeLayout(相对布局)

在上期中我们对LinearLayout进行了详细的解析,LinearLayout也是我们用的比较多的一个布局,更多的时候更钟情于它的 weight(权重) 属性,等比例划分,对屏幕适配还是 帮助蛮大的;但是使用LinearLayout的时候也有一个问题,就是当界面比…

橘子学JDK之JMH-02(BenchmarkModes)

一、案例二代码 这次我们来搞一下官网文档的第二个案例,我删除了一些没用的注释,然后对代码做了一下注释的翻译,可以看一下意思。 package com.levi;import org.openjdk.jmh.annotations.*; import org.openjdk.jmh.runner.Runner; import …

【算法练习】29:插入排序学习笔记

一、插入排序的算法思想 原理:将一个无序的数据序列逐步转化为有序序列。算法将待排序的数组分为两个部分已排序部分和未排序部分。 时间复杂度:插入排序的时间复杂度在最坏、平均和最好情况下的表现相同,均为 ,其中 n 是待排序数…

极狐GitLab对接OAuth2实现SSO

本文作者:极狐(GitLab) 高级解决方案架构师 武让 GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。 企…

Python处理PDF:在PDF文档中插入页眉和页脚

在处理篇幅较长、结构复杂的PDF文档时,页眉和页脚的设计与插入就显得尤为重要。它们不仅扮演着美化文档、提升专业度的角色,更承担了导航指引、信息标注的重要功能。 页眉通常用于展示文档的标题或章节名称,有助于读者在翻阅过程中迅速定位所…