Python之json模块和pickle模块详解

news2024/9/25 3:25:48

json模块和pickle模块的用法

在python中,可以使用pickle和json两个模块对数据进行序列化操作。

其中:

json可以用于字符串或者字典等与python数据类型之间的序列化与反序列化操作。

pickle可以用于python特有类型与python数据类型之间的序列化与反序列化操作。

json模块的用法

1. 查看json模块内的方法:

>>> import json
>>> dir(json)
['JSONDecodeError', 'JSONDecoder', 'JSONEncoder', '__all__', '__author__', '__builtins__', '__cached__', '__doc__', 
'__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '__version__', '_default_decoder', 
'_default_encoder', 'decoder', 'dump', 'dumps', 'encoder', 'load', 'loads', 'scanner']

2. json模块常用的功能的:dumps,dump,loads,load

3.使用json.dumps方法可以将字典等数据格式化成一个字符串,这样可以方便别的编程语言进行调用。

>>> dic1={"k1":"v1","k2":"v2"}
>>> res=json.dumps(dic1)
>>> print(res)
{"k1": "v1", "k2": "v2"}
>>> print(type(res))
<class 'str'>

格式化后的字符串看似跟原来的没什么两样,但是查看格式化后的类型就会发现是一个字符串,已经被json模块处理过了。

4.可以使用json.loads进行反序列化

>>> print(type(res2))
<class 'dict'>
>>> print(res)
{"k1": "v1", "k2": "v2"}
>>> print(type(res))
<class 'str'>
>>> res2=json.loads(res)
>>> print(res2)
{'k1': 'v1', 'k2': 'v2'}

5.还可以用json.dump方法把字典等数据类型序列化进入一个文件中,等待别的程序进行调用。

import json
dic1={"k1":"v1","k2":"v2"}
with open("f1","w") as f:
    json.dump(dic1,f)

运行上面的代码,可以看到在同级目录下,生成一个名为“f1”的文件,打开f1文件,其内容为:

{"k1": "v1", "k2": "v2"}

6.可以使用json.load方法读取文件f1中的内容:

import json
with open("f1") as f:
    res=json.load(f)
    print(res)
    print(type(res))

打印反序列化后的数据及其类型,得到的结果为:

{'k1': 'v1', 'k2': 'v2'}
<class 'dict'>

pickle模块的用法

1.查看pickle模块内的方法:

>>> import pickle
>>> dir(pickle)
['ADDITEMS', 'APPEND', 'APPENDS', 'BINBYTES', 'BINBYTES8', 'BINFLOAT', 'BINGET', 'BININT', 'BININT1', 'BININT2',
 'BINPERSID', 'BINPUT', 'BINSTRING', 'BINUNICODE', 'BINUNICODE8', 'BUILD', 'DEFAULT_PROTOCOL', 'DICT', 'DUP', 
 'EMPTY_DICT', 'EMPTY_LIST', 'EMPTY_SET', 'EMPTY_TUPLE', 'EXT1', 'EXT2', 'EXT4', 'FALSE', 'FLOAT', 'FRAME', 
 'FROZENSET', 'FunctionType', 'GET', 'GLOBAL', 'HIGHEST_PROTOCOL', 'INST', 'INT', 'LIST', 'LONG', 'LONG1', 'LONG4',
 'LONG_BINGET', 'LONG_BINPUT', 'MARK', 'MEMOIZE', 'NEWFALSE', 'NEWOBJ', 'NEWOBJ_EX', 'NEWTRUE', 'NONE', 'OBJ', 
 'PERSID', 'POP', 'POP_MARK', 'PROTO', 'PUT', 'PickleError', 'Pickler', 'PicklingError', 'PyStringMap', 'REDUCE', 
 'SETITEM', 'SETITEMS', 'SHORT_BINBYTES', 'SHORT_BINSTRING', 'SHORT_BINUNICODE', 'STACK_GLOBAL', 'STOP', 'STRING', 
 'TRUE', 'TUPLE', 'TUPLE1', 'TUPLE2', 'TUPLE3', 'UNICODE', 'Unpickler', 'UnpicklingError', '_Framer', '_Pickler', 
 '_Stop', '_Unframer', '_Unpickler', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', 
 '__name__', '__package__', '__spec__', '_compat_pickle', '_dump', '_dumps', '_extension_cache', '_extension_registry',
 '_getattribute', '_inverted_registry', '_load', '_loads', '_test', '_tuplesize2code', 'bytes_types', 'codecs',
 'compatible_formats', 'decode_long', 'dispatch_table', 'dump', 'dumps', 'encode_long', 'format_version', 'io', 
 'islice', 'load', 'loads', 'maxsize', 'pack', 're', 'sys', 'unpack', 'whichmodule']

2.想查看某一个方法的帮助文档:

help(pickle.modules)

比如,我想知道pickle下的dump模块怎么用:

help(pickle.dump)

就可以得到pickle.dump方法的帮助文档

3.pickle模块常用的方法有:dumps,loads,dump,load

4.使用pickle.dumps对数据进行序列化操作

import pickle
l1=[1,2,3,4,5]
t1=(1,2,3,4,5)
dic1={"k1":"v1","k2":"v2","k3":"v3"}
res_l1=pickle.dumps(l1)
res_t1=pickle.dumps(t1)
res_dic=pickle.dumps(dic1)
print(res_l1)
print(res_t1)
print(res_dic)

对数据进行序列化操作后,打印数据得到结果为:

b'\x80\x03]q\x00(K\x01K\x02K\x03K\x04K\x05e.'
b'\x80\x03(K\x01K\x02K\x03K\x04K\x05tq\x00.'
b'\x80\x03}q\x00(X\x02\x00\x00\x00k1q\x01X\x02\x00\x00\x00v1q\x02X\x02\x00\x00\x00k2q\x03X\x02\x00
\x00\x00v2q\x04X\x02\x00\x00\x00k3q\x05X\x02\x00\x00\x00v3q\x06u.'

可以看到是一堆二进制乱码

5.使用pickle.loads进行反序列化操作

import pickle
l1=[1,2,3,4,5]
t1=(1,2,3,4,5)
dic1={"k1":"v1","k2":"v2","k3":"v3"}
res_l1=pickle.dumps(l1)
res_t1=pickle.dumps(t1)
res_dic=pickle.dumps(dic1)
print(pickle.loads(res_l1),type(pickle.loads(res_l1)))
print(pickle.loads(res_t1),type(pickle.loads(res_t1)))
print(pickle.loads(res_dic),type(pickle.loads(res_dic)))

打印序列化后的数据及其类型,得到结果为:

[1, 2, 3, 4, 5] <class 'list'>
(1, 2, 3, 4, 5) <class 'tuple'>
{'k1': 'v1', 'k2': 'v2', 'k3': 'v3'} <class 'dict'>

可以看到序列化之前是什么类型的数据,反序列化后其数据类型不变。

6.可以用pickle.dumps把列表,元组或字典序列化进一个文件中以实现永久保存。

把列表l1序列化进一个文件f1中:

import pickle
l1=[1,2,3,4,5]
t1=(1,2,3,4,5)
dic1={"k1":"v1","k2":"v2","k3":"v3"}
with open("f1","wb") as f:
    pickle.dump(l1,f)

7.可以使用pickle.load对文件f1进行反序列化,得到文件f1里保存的数据

import pickle
with open("f1","rb") as f:
    res=pickle.load(f)
    print(res)

反序列化之后,打印数据及其类型可以看到:

[1, 2, 3, 4, 5]
<class 'list'>

使用同样的方法,也可以把元组,或字典序列化进一个文件中以实现永久保存。

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

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

相关文章

【软件工程】软件工程复习题库2023

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; SpringCloud MybatisPlus JVM 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 软件工程复习题库 一、选择题二、填空题三、判断题四…

E : DS查找—二叉树平衡因子

Description 二叉树用数组存储&#xff0c;将二叉树的结点数据依次自上而下,自左至右存储到数组中&#xff0c;一般二叉树与完全二叉树对比&#xff0c;比完全二叉树缺少的结点在数组中用0来表示。 计算二叉树每个结点的平衡因子&#xff0c;并按后序遍历的顺序输出结点的平衡…

SpringBoot基于gRPC进行RPC调用

SpringBoot基于gRPC进行RPC调用 一、gRPC1.1 什么是gRPC&#xff1f;1.2 如何编写proto1.3 数据类型及对应关系1.4 枚举1.5 数组1.6 map类型1.7 嵌套对象 二、SpringBoot gRPC2.1 工程目录2.2 jrpc-api2.2.1 引入gRPC依赖2.2.2 编写 .proto 文件2.2.3 使用插件机制生产proto相关…

延迟消息队列的几种实现方案,哪种更适合业务,要看具体情况分析

延迟消息队列的几种实现方案&#xff0c;延迟消息怎么实现&#xff0c;很多人可能一想到的是rabbitmq的死信队列来实现&#xff0c;但是一旦引入mq的话&#xff0c;就依赖这个中间件&#xff0c;另外维护成本&#xff0c;开发成本都很大&#xff0c;那有么有简单点的实现方式呢…

ubuntu推送本地仓库到coding

本教程提供在ubuntu系统下推送本地仓库到coding的指令&#xff0c;用于查阅 一、主要步骤有&#xff1a; 0.初始化仓库 git init 1.添加远程仓库 git remote add origin https://coding.git #修改自己仓库链接 &#xff08;命名仓库别名为origin&#xff09; 2.提交代码…

服务器解析漏洞有哪些?IIS\APACHE\NGINX解析漏洞利用

解析漏洞是指在Web服务器处理用户请求时&#xff0c;对输入数据&#xff08;如文件名、参数等&#xff09;进行解析时产生的漏洞。这种漏洞可能导致服务器对用户提供的数据进行错误解析&#xff0c;使攻击者能够执行未经授权的操作。解析漏洞通常涉及到对用户输入的信任不足&am…

那些令人惊叹的awk简略写法

​​​​​​​awk是一门美妙的语言&#xff0c;被称为unix命令行工具皇冠上的明珠。它有很多简略写法&#xff0c;用好了可以用极少的代码快速解决问题。 下面就列举一些令人惊叹的awk简略写法&#xff1a; awk {sub(/pattern/, "foobar")} 1 # 无论替换是否成功&…

一步步教你创建酒店预订小程序

如果你想为你的酒店或旅馆创建一个预订小程序&#xff0c;这篇文章将为你提供详细的步骤和指南。我们将按照以下顺序进行&#xff1a; 一、进入乔拓云网后台 首先&#xff0c;打开乔拓云网的官方网站&#xff0c;点击右上角的“登录”按钮&#xff0c;登录成功后&#xff0c;点…

基于vue与three.js,监听FPX(Stats类使用)

第一步&#xff0c;引入stats类并new出来 import Stats from three/examples/jsm/libs/stats.module.js; data(){return {stats : new Stats(),} } 第二步&#xff0c;添加dom mounted() {this.init3D();this.animate();window.addEventListener("keydown", this.…

【大数据面试】Flink面试题附答案

目录 ✅Flink介绍、特点、应用场景 ✅Flink与Spark Streaming的区别 ✅Flink有哪些部署模式 ✅Flink架构 ✅怎么设置并行度&#xff1f; ✅什么是算子链&#xff1f; ✅什么是任务槽&#xff08;Task Slots&#xff09;&#xff1f; ✅任务槽和并行度的关系 ✅Flink作…

easyexcel常见注解

easyexcel常见注解 一、依赖 <!--阿里巴巴EasyExcel依赖--><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.10</version></dependency>二、常见注解 ExcelProperty 注解中…

使用Shell脚本监控主机

实验环境 某公司随着业务的不断发展&#xff0c;所使用的Linux服务器也越来越多&#xff0c;管理员希望编写一个简单的性 能监控脚本&#xff0c;放到各服务器中&#xff0c;当监控指标出现异常时发送告警邮件。 需求描述 > 编写名为sysmon.sh的 Shell 监控脚本。 > 监…

《数据结构、算法与应用C++语言描述》- 最小输者树模板的C++实现

输者树 完整可编译运行代码见&#xff1a;Github::Data-Structures-Algorithms-and-Applications/_31loserTree 输者树&#xff1a;每一个内部节点所记录的都是比赛的输者&#xff0c;晋级的节点记录在边上。本文中&#xff0c;赢者是分数较低的那个&#xff0c;输者是分数高…

安捷伦Agilent 34970A数据采集

易学易用 从34972A简化的配置到内置的图形Web界面&#xff0c;我们都投入了非常多的时间和精力&#xff0c;以帮助您节约宝贵的时间。一些非常简单的东西,例如模块上螺旋型端子连接器内置热电偶参考结、包括众多实例和提示的完整用户文档&#xff0c;以及使您能够在开机数分钟后…

【C++初阶】学习string类的模拟实现

目录 前言&#xff1a;一、创建文件和类二、实现string类2.1 私有成员和构造函数2.2 析构函数2.3 拷贝构造函数2.3.1 写法12.3.2 写法2 2.4 赋值重载函数2.4.1 写法12.4.2 写法2 2.5 迭代器遍历访问2.6 下标遍历访问2.7 reserve2.8 resize2.9 判空和清理2.10 尾插2.10.1 尾插字…

【mask转json】文件互转

mask图像转json文件 当只有mask图像时&#xff0c;可使用下面代码得到json文件 import cv2 import os import json import sysdef func(file:str) -> dict:png cv2.imread(file)gray cv2.cvtColor(png, cv2.COLOR_BGR2GRAY)_, binary cv2.threshold(gray,10,255,cv2.TH…

在线考试系统-软件与环境

一. 软件 1.Navicat、phpstudy、Idea、Vsode 参考 网盘链接 二.配置文件 1.Nodejs、JDK 参考 网盘链接 三.安装运行 1.下载网盘内的软件&#xff0c;并进行安装 2.安装对应的配置文件并进行配置 (1)VsCode 运行 a.新建terminal b.输入命令 npm run dev c.启动成功 (2)Php…

力扣题目学习笔记(OC + Swift) 14. 最长公共前缀

14. 最长公共前缀 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 “”。 方法一 竖向扫描法 个人感觉纵向扫描方式比较直观&#xff0c;符合人类理解方式&#xff0c;从前往后遍历所有字符串的每一列&#xff0c;比较相同列上的…

通过https协议访问Tomcat部署并使用Shiro认证的应用跳转登到录页时协议变为http的问题

问题描述&#xff1a; 在最近的一个项目中&#xff0c;有一个存在较久&#xff0c;并且只在内部城域网可访问的一个使用Shiro框架进行安全管理的Java应用&#xff0c;该应用部署在Tomcat服务器上。起初&#xff0c;应用程序可以通过HTTP协议访问&#xff0c;一切运行都没…

海外代理IP如何选择?如何避开误区?

近年来&#xff0c;我国互联网商业保持持续发展的状态大环境的优化&#xff0c;大大小小的企业都想乘胜追击&#xff0c;大展宏图&#xff0c;积极推动各项数据业务的进程。 而对于跨境业务来说&#xff0c;代理IP是不可或缺的重要工具之一&#xff0c;市面上代理IP类型众多&a…