【Python】Python 中实现数据序列化

news2024/11/27 16:29:48

文章目录

  • 一、前言
  • 二、为什么要进行序列化
  • 三、Python 中的数据序列化
    • 1. json模块
    • 2. pickle模块
    • 3. shelve模块
    • 4. 总结
  • 参考链接


一、前言

首先,要了解什么是序列化,请参考我的另一篇文章:序列化与反序列化介绍

本文主要介绍 Python 中的数据序列化,主要介绍 Python 内置的几个用于进行数据序列化的模块。


二、为什么要进行序列化

每种编程语言都有各自的数据类型,其中面向对象的编程语言还允许开发者自定义数据类型(如:自定义类),Python也是一样。很多时候我们会有这样的需求:

  • 网络传输数据:把内存中的各种数据类型的数据通过网络传送给其它机器或客户端。
  • 数据存储:把内存中的各种数据类型的数据保存到本地磁盘持久化。

如果要将一个系统内的数据通过网络传输给其它系统或客户端,我们通常都需要先把这些数据转化为字符串或字节串,而且需要规定一种统一的数据格式才能让数据接收端正确解析并理解这些数据的含义。XML 是早期被广泛使用的数据交换格式,在早期的系统集成论文中经常可以看到它的身影;如今大家使用更多的数据交换格式是JSON(Javascript Object Notation),它是一种轻量级的数据交换格式。JSON相对于XML而言,更加加单、易于阅读和编写,同时也易于机器解析和生成。除此之外,我们也可以自定义内部使用的数据交换格式。

如果是想把数据持久化到本地磁盘,这部分数据通常只是供系统内部使用,因此数据转换协议以及转换后的数据格式也就不要求是标准、统一的,只要本系统内部能够正确识别即可。但是,系统内部的转换协议通常会随着编程语言版本的升级而发生变化(改进算法、提高效率),因此通常会涉及转换协议与编程语言的版本兼容问题,下面的pickle协议就是这样一个例子。


三、Python 中的数据序列化

本节要介绍的就是Python内置的几个用于进行数据序列化的模块:

在这里插入图片描述

1. json模块

大部分编程语言都会提供处理 json 数据的接口,Python 2.6开始加入了 json 模块,且把它作为一个内置模块提供,无需下载即可使用。

Python的 JSON 模块中,序列化与反序列化的过程分别叫做:encoding 和 decoding:

  • encoding: 把 Python 对象转换成 JSON 字符串
  • decoding: 把 JSON 字符串转换成 python 对象

json模块提供了以下两个方法来进行序列化和反序列化操作:
在这里插入图片描述

除此之外,json模块还提供了两个额外的方法允许我们直接将序列化后得到的 json 数据保存到文件中,以及直接读取文件中的 json 数据进行反序列化操作:
在这里插入图片描述

2. pickle模块

pickle 模块实现了用于对 Python 对象结构进行序列化和反序列化的二进制协议,与 json 模块不同的是 pickle 模块序列化和反序列化的过程分别叫做 pickling 和 unpickling:

  • pickling:是将 Python 对象转换为字节流的过程
  • unpickling: 是将字节流二进制文件或字节对象转换回 Python 对象的过程

pickle模块与json模块对比:

  1. JSON是一种文本序列化格式(它输出的是unicode文件,大多数时候会被编码为utf-8),而pickle是一个二进制序列化格式;
  2. JOSN是我们可以读懂的数据格式,而pickle是二进制格式,我们无法读懂;
  3. JSON是与特定的编程语言或系统无关的,且它在Python生态系统之外被广泛使用,而pickle使用的数据格式是特定于Python的;
  4. 默认情况下,JSON只能表示Python内建数据类型,对于自定义数据类型需要一些额外的工作来完成;pickle可以直接表示大量的Python数据类型,包括自定数据类型(其中,许多是通过巧妙地使用Python内省功能自动实现的;复杂的情况可以通过实现specific object API来解决)

pickle 模块提供的几个序列化/反序列化的函数与 json 模块基本一致:

在这里插入图片描述

3. shelve模块

shelve是一个简单的数据存储方案,类似 key-value 数据库,可以很方便的保存 python 对象,其内部是通过 pickle 协议来实现数据序列化。shelve只有一个 open() 函数,这个函数用于打开指定的文件(一个持久的字典),然后返回一个shelf 对象。shelf 是一种持久的、类似字典的对象。它与“dbm”的不同之处在于,其 values 值可以是任意基本 Python 对象–pickle 模块可以处理的任何数据。这包括大多数类实例、递归数据类型和包含很多共享子对象的对象。keys 还是普通的字符串。

在这里插入图片描述
flag 参数表示打开数据存储文件的格式,可取值与 dbm.open() 函数一致:

在这里插入图片描述
protocol 参数表示序列化数据所使用的协议版本,默认是pickle v3;
writeback 参数表示是否开启回写功能。

我们可以把 shelf 对象当 dict 来使用–存储、更改、查询某个 key 对应的数据,当操作完成之后,调用shelf 对象的 close() 函数即可。当然,也可以使用上下文管理器(with语句),避免每次都要手动调用 close() 方法。

4. 总结

1. 对比

  1. json模块常用于编写web接口,将Python数据转换为通用的json格式传递给其它系统或客户端;也可以用于将Python数据保存到本地文件中,缺点是明文保存,保密性差。另外,如果需要保存费内置数据类型需要编写额外的转换函数或自定义类。
  2. pickle模块和shelve模块由于使用其特有的序列化协议,其序列化之后的数据只能被Python识别,因此只能用于Python系统内部。另外,Python 2.x 和 Python 3.x 默认使用的序列化协议也不同,如果需要互相兼容需要在序列化时通过protocol参数指定协议版本。除了上面这些缺点外,pickle模块和shelve模块相对于json模块的优点在于对于自定义数据类型可以直接序列化和反序列化,不需要编写额外的转换函数或类。
  3. shelve模块可以看做是pickle模块的升级版,因为shelve使用的就是pickle的序列化协议,但是shelve比pickle提供的操作方式更加简单、方便。shelve模块相对于其它两个模块在将Python数据持久化到本地磁盘时有一个很明显的优点就是,它允许我们可以像操作dict一样操作被序列化的数据,而不必一次性的保存或读取所有数据。

2. 建议

  1. 需要与外部系统交互时用json模块;
  2. 需要将少量、简单Python数据持久化到本地磁盘文件时可以考虑用pickle模块;
  3. 需要将大量Python数据持久化到本地磁盘文件或需要一些简单的类似数据库的增删改查功能时,可以考虑用shelve模块。

参考链接

  1. Python之数据序列化(json、pickle、shelve)详解

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

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

相关文章

i.MX 6ULL 驱动开发 二十七:块设备

参考:【块设备】通用块层 struct bio 详解 | zzm (aliez22.github.io) 一、Linux 中块设备驱动框架 二、块设备基本概念 1、扇区的概念来自硬件,扇区是硬件最小操作单位。 2、块的概念来自文件系统,是文件系统数据处理的最小单位。 3、段…

django 开启CSRFtoken校验,以及postman实现问题

1.0 Django默认的CSRFtoken 表现: 后端使用的是Django的表单验证 post请求携带参数的问题 2.0 先处理post请求携带数据的csrfmiddlewaretoken 在登录界面 在input输入框中隐藏,所以需要提取input的value值,在【tests】脚本中进行提取&…

小样本关系分类(原型学习):Better Few-Shot Relation Extraction with Label Prompt Dropout

Better Few-Shot Relation Extraction with Label Prompt Dropout core idea 在小样本关系分类中,prompt信息是relation name是信息,这篇文章为了保持train和test的一致性,将train中的一些relation name信息删除掉了。(相反&…

linux应用移植问题

背景 公司设备降成本,设备运行平台从armv7架构mpu换成了armv5架构的mpu,应用移植过程都挺顺利的,只是牵涉到一个引用外部库的应用时,运行该应用到引用库中的函数时,应用抛出illegal instrution异常。 问题分析 初步…

HTML(超文本标记语言)

HTML(超文本标记语言) 网页的基本信息 、等成对的标签,分别叫**开放标签**和**闭合标签**,单独呈现的标签(空元素),如;意为用 / 来关闭空元素 DOCTYPE:告诉浏览器,我们要使用什么规范 head:代…

Jenkins安装与配置Windows11系统

目录 Jenkins安装 一、下载 官网地址:Jenkins download and deployment 点击LTS(长期稳定版)下的Windows 二、安装 基本就是一路Next即可 三、配置 访问地址 http://localhost:8080/,会出现如下界面: 安装 注&…

Redis实战——优惠券秒杀(一人一单业务)

需求:修改秒杀业务,要求同一个优惠券,一个用户只能下一单 我们只需要在增加订单之前,拿用户id和优惠券id判断订单是否已经存在,如果存在,说明用户已经购买。 代码实现: package com.hmdp.serv…

狂神说Go语言学习笔记(二)

一、匿名变量 匿名变量的特点是一个下划线 “_”,它本身就是一个特殊的标识符。它可以像其他标识符那样用于变量的声明或赋值(任何类型都可以赋值给它),但任何赋给这个标识符的值都将被抛弃,因此这些值不能在后续的代…

共享雨伞app开发,提高资源利用率

共享经济无疑是当下热门行业之一,生活中随处可见的共享自行车、共享汽车、共享充电宝等一系列设备都是共享经济的产物。互联网时代下的共享经济已经呈现出多元化的发展趋势,其中在日常出行方面,共享雨伞的出现可以很好的解决用户偶遇的突发天…

Centos7 + kubenetes 一键安装实战

1. kubernetes部署环境要求 一台或多台机器,操作系统CentOS7.x-86_x64硬件配置:内存2GB或2G,CPU 2核或CPU 2核集群内各个机器之间能相互通信集群内各个机器可以访问外网,保证网络畅通(最好能访问谷歌),需要…

【STM32笔记】HAL库中的SPI传输(可利用中断或DMA进行连续传输)

【STM32笔记】HAL库中的SPI传输(可利用中断或DMA进行连续传输) SPI 是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。是Motorola(摩托罗拉)首先在其MC68HCXX系列处理器上定义的。 SPI,是一种高速的&…

优秀软件测试报告

Document number 文档编号 Confidentiality level 密级 Test Report-01 [绝密/秘密/内部公开] Document version 文档版本 Total 10 pages 共 10 页 V1.0 测试报告 Prepared by 拟制 Date 日期 yyyy-mm-dd Reviewed by 评审人 Date 日期 yyyy-mm-dd Approved b…

CSS基础(超详解)

目录 1 css基础知识 1.1基础知识 1.1 概述 1.2 优势 1.3应用css的步骤 1.2 css基本语法 1.3 css使用方法 1.3.1 内嵌样式 1.3.2 内部样式 1.3.3 外部样式 1.3.4 使用import引入外部样式文件 1.3.5 叠层样式优先级 1.3.6 注释 2 CSS选择器 2.1 元素选择器 2.2 类…

Linux crontab定时任务设置

1.检查是否安装了crontab # rpm -qa | grep crontab 2.重启crontab服务 一定重启,这样确保了crontab服务的开启 # /etc/init.d/crond restart 3.我们直接以root用户进行操作。所以直接进到root的cron配置文件。 # cd /var/spool/cron/ 4.可以查看一下 root 用户…

VisDrone数据集之集群检测(一)

VisDrone坐标信息 VisDrone数据集格式: txt标签内容为:bbox_left,bbox_top,bbox_width,bbox_height,score,object_category,truncation,occlusion 类别: ignored regions(0), pede…

【一】曾经那些错误,你又踩坑了吗?

巩固基础和不断练习,我们才会进步!这一期开始,我们就要看看我们之前的学过的知识到底掌握了没有,再通过练习去巩固! 目录 一、for循环 二、指针有关内容 1.*(解引用)和其他运算符 2.指针变…

碰到CTS问题我该如何处理?

一、什么是CTS? CTS测试全称为系统兼容测试(Compatibility Test suite),CTS是为了测试手机是否符合google定义的兼容性规范(Compatibility Definition)。从而基于Android的应用程序能在基于同一个api版本的…

网页JS自动化脚本(四)修改元素的尺寸颜色显隐状态

修改元素尺寸 在定位到了元素之后, 我们就可以对元素进行一些修改了,我们先来修改元素泊宽度以及高度 window.onloadfunction(){var theElementdocument.querySelector("img.undertips-link-lefticon");theElement.style.width"100px";theElement.style.…

BL200EC如何与欧姆龙相连

1、欧姆龙 NX1P2 的 Port1 接到电脑的网口,Port2 接到 BL200EC 的 ETH1 网口。 欧姆龙 NX1P2 和 BL200EC 通电。 2、打开 Sysmac Studio 软件,新建工程,选择 NX1P2-9024DT,点击创建。 ​ 编辑切换为居中 添加图片注释&#xf…

【云原生】服务网格kiali开发环境搭建问题解析

文章目录背景环境准备参考连接问题1:windows如何配置kiali开发环境问题2:kiali如何配置k8s连接问题3:kiali启动报错关键词:方便你们找到我背景 kiali(凯莉)是istio技术对应的管理系统,其前端为…