当前位置: 首页 > 编程日记 > 正文

python模块之json,pickle

序列化是指把内存里的数据转变成字符串,以使其能保存到硬盘上或者通过网络输送到远程。

序列化的两个模块:

json:只能把python中的int/str/list/tuple/dict类型的数据,可以在不同的语言之间传递数据。Python和JavaScript数据对应关系:

JavaScriptPython
{ }dict
[]list
"String"str
12345.6int/float
true/falseTrue/False
nullNone

pickle:支持所有的python数据,但是只能在python中使用,存储数据占空间大。

python 的 json库:常用的方法有json.dumps()、json.loads()、json.dump、json.load()

Json

json.dumps():

  1. import json
  2. dic = {"name": "egon", "password": "abc123"}
  3. print(dic)
  4. print(json.dumps(dic))

输出的结果

  1. {'name': 'egon', 'password': 'abc123'}
  2. {"name": "egon", "password": "abc123"}

对比dict类型数据和json类型数据可以知道在json中字符串符号都是用双引号,而在python中一般字符串是用单引号,在打印输出上有一些区别。dic是dict类型,json.dumps(dic)是str类型。

josn.loads():

  1. import json
  2. dic = {"name": "egon", "password": "abc123"}
  3. json_data = json.dumps(dic)
  4. str_dic1 = '{"name": "egon", "password": "abc123"}'
  5. print(json.loads(json_data))
  6. print(json.loads(str_dic1))

输出的结果

  1. <class 'dict'>
  2. {'name': 'egon', 'password': 'abc123'}
  3. <class 'dict'>
  4. {'name': 'egon', 'password': 'abc123'}

根据输出结果可以看出,json.loads()可以把json.dumps()转换的json数据再还原,也可以把字符串中符合json格式的数据还原成dict类型。

json.dump():

  1. import json
  2. dic = {"name": "egon", "password": "abc123"}
  3. file = open('info.json', 'w')
  4. json.dump(dic, file)

这段代码运行后会生成一个info.json文件,json.dump()就是把数据dic转成json数据,然后存入info.json中。

当然也可以用with语句

  1. import json
  2. dic = {"name": "egon", "password": "abc123"}
  3. with open('info.json', 'w') as file:
  4. json.dump(dic, file)

两种方式保存的文件内容一致:

{"name": "egon", "password": "abc123"}

json.load():

  1. import json
  2. dic = {"name": "egon", "password": "abc123"}
  3. with open('info.json', 'r') as file:
  4. data = json.load(file)
  5. print(type(data))
  6. print(data)

输出的结果

  1. <class 'dict'>
  2. {'name': 'egon', 'password': 'abc123'}

json.load()把文件中json格式的字符串还原成字典

关于json的高级用法

一般json不能直接转换自定义的对象,可以定义一个函数用于将对象转换成字典,来实现将自定义对象转换为json数据

定义一个student类,并创建一个对象s

  1. class student:
  2. def __init__(self, name, age):
  3. self.name = name
  4. self.age = age
  5. def tostr(self):
  6. print(self.name, self.age)
  7. s = student('bighead', 22)

直接调用json.dumps(s),会报错,因为json.dumps()无法直接转换自定义对象

但是查看json.dumps()函数会发现有很多参数

其中有一个default的参数

定义一个把student对象转换成字典的方法

  1. def student_to_dict(s):
  2. return {'name': s.name, 'age': s.age}

然后调用json.dumps()

  1. data = json.dumps(s, default=student_to_dict)
  2. print(data)

输出的结果

{"name": "bighead", "age": 22}

会发现能使用json序列化自定义对象了

但是还可以用另一种不定义函数的方式序列化自定义对象,因为通常每个自定义对象都有一个.__dict__属性

  1. data = json.dumps(s, default=lambda obj:obj.__dict__)
  2. print(data)

输出的结果

{"name": "bighead", "age": 22}

但是这样只能把自定义对象转为json,还不能把json数据还原为自定义对象

查看json.loads()函数的全部参数会发现有一个参数object_hook

定义一个函数把字典转换成student对象

  1. def dict_to_student(dic):
  2. return student(dic['name'], dic['age'])

然后调用json.loads()

  1. s = json.loads(data, object_hook=dict_to_student)
  2. print(type(s))
  3. s.tostr()

输出的结果

  1. <class '__main__.student'>
  2. bighead 22

原本的json数据被转换成了student对象

相同的,json.dump()也能使用default参数,json.load()也能使用object_hook参数


Pickle

pickle.dumps():

这个函数会把python所有的类型的数据转换成二进制数据,所以在把用pickle转换后的数据存进文件时,要使用'wb'的方式,打开文件

  1. import pickle
  2. dic = {'name': 'egon', 'password': 'abc123'}
  3. data = pickle.dumps(dic)
  4. print(data)

运行的结果

b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x04\x00\x00\x00egonq\x02X\x08\x00\x00\x00passwordq\x03X\x06\x00\x00\x00abc123q\x04u.'

可以看到,pickle.dumps()可以把字典类型的数据转换成二进制数据

相同的pickle.dump(),也可以把python的数据转换成二进制数据,但是这个方法可以直接将数据存入指定文件

  1. import pickle
  2. dic = {'name': 'egon', 'password': 'abc123'}
  3. with open('pickle', 'wb')as f:
  4. pickle.dump(dic, f)

pickle.loads():

与pickle.dumps()功能相反,这个函数是把pickle.dumps()序列化后的数据还原

  1. dic1 = pickle.loads(data)
  2. print(dic1)

运行的结果

{'name': 'egon', 'password': 'abc123'}

相同的,pickle.load()方法也能将序列化的数据还原,但是pickle.load()需要打开存储序列化数据的文件

  1. with open('pickle', 'rb')as f:
  2. dic2 = pickle.load(f)
  3. print(dic2)

运行的结果

{'name': 'egon', 'password': 'abc123'}

注意:使用pickle读写文件都要用'b'('rb','wb'),而json都用't'('rt','wt')

转载于:https://www.cnblogs.com/zhangshengxiang/p/9475748.html

相关文章:

关于如何在pc端使用github

http://www.bcwhy.com/thread-17636-1-1.html转载于:https://www.cnblogs.com/glgl2424/archive/2013/03/13/2956944.html

Python爬虫1-Scrapy环境的安装

一. Scrapy环境的安装 1. Scrapy各平台支持情况 除了python3在Windows下不支持外&#xff0c;其余&#xff08;Linux&#xff0c;Mac&#xff09;均支持 2. 安装miniconda (1)建议使用Python2&#xff0c;用miniconda安装scrapy (2)miniconda时Python环境管理工…

汉字笔画数据_统计学原理 数据的预处理

数据审核数据审核—原始数据(raw data)完整性审核应调查的单位或个体是否有遗漏所有的调查项目或变量是否填写齐全准确性审核数据是否真实反映实际情况&#xff0c;内容是否符合实际数据是否有错误&#xff0c;计算是否正确等数据审核—二手数据(second hand data)适用性审核弄…

SqlServer时间函数的使用例子整理

为什么80%的码农都做不了架构师&#xff1f;>>> 整理SqlServer2008的时间函数如下&#xff1a; 1.获取系统时间 select getdate(); --2012-05-06 22:26:49.950 select current_timestamp; --2012-05-06 22:26:49.950 select getutcdate(); --20…

bzoj 4710 [Jsoi2011]分特产 组合数学+容斥原理

题面 题目传送门 解法 考虑容斥原理 显然&#xff0c;我们可以枚举有多少个人没有收到 然后就转化成一个组合问题了 假设现在有\(x\)个物品&#xff0c;\(n\)个人&#xff0c;可以有人没有被分到&#xff0c;那么分给这\(n\)个人的方案数为\(nx-1\choose n-1\) 然后就是分别计算…

Python爬虫2-GET_POST与开发者工具

一. GET_POST与开发者工具 1. 浏览器的基本工作规则 浏览器请求访问服务器&#xff0c;服务器返回数据 (1) 请求的格式 GET&#xff1a;长度不能大于2k参数明文显示在地址栏&#xff0c;不保密&#xff0c;通常用在查询请求 POST:长度可以很大&#xff0c;参数写…

springcloud是什么_阿里P8道出,入职阿里必会199道SpringCloud面试题,你能掌握多少?...

前言Spring Cloud 自 2016 年 1 月发布第一个 Angel.SR5 版本&#xff0c;到目前 2020 年 3 月发布 Hoxton.SR3 版本&#xff0c;已经历经了 4 年时间。这 4 年时间里&#xff0c;Spring Cloud 一共发布了 46 个版本&#xff0c;支持的组件数从 5 个增加到 21 个。Spring Cloud…

不一样的命令行 – Windows PowerShell简介

引子 一直很羡慕Linux的命令提示符&#xff08;当然他们叫Shell&#xff09;。正则表达式&#xff0c;管道&#xff0c;各种神奇的命令&#xff0c;组合起来就能高效完成很多复杂的任务。效率实在是高。流了n年的哈喇子以后&#xff0c;终于有幸用上了Win7&#xff0c;邂逅了cm…

excel中会计专用格式问题_解决方法

excel 2003在使用格式中当选择会计专用会出现负号在左,数字在右的情况.这类设置并不是在excel中完成,而是在控制面板,区域和语言选项---自定义中设置---货币中设置,-&#xffe5;1.1改为&#xffe5;-1.1就可以解决了.包括千位分割样式保留的小数点位数等都可以在这里进行设置来…

Spring.Net Aop

Spring.Net 有四种通知&#xff1a; IMethodBeforeAdvice&#xff0c;IAfterReturningAdvice&#xff0c;IMethodInterceptor&#xff0c;IThrowsAdvice BeforeAdvice 1 using System.Reflection;2 using Spring.Aop;3 public class BeforeAdvice : IMethodBefore…

Oracle to_char函数的使用方法

本文转载于:https://blog.csdn.net/mikyz/article/details/69397030 本文转载于:https://www.cnblogs.com/aipan/p/7941917.html 本文转载于:https://blog.csdn.net/jinlong5200/article/details/3135949 转载于:https://www.cnblogs.com/demon09/p/9485627.html

python装饰器教学_Python装饰器学习(九步入门)

这是在Python学习小组上介绍的内容&#xff0c;现学现卖、多练习是好的学习方式。第一步&#xff1a;最简单的函数&#xff0c;准备附加额外功能 # -*- coding:gbk -*-示例1: 最简单的函数,表示调用了两次def myfunc():print("myfunc() called.")myfunc()myfunc()第二…

跨平台表空间传输(linux 10g表空间跨平台迁移到window 11g)

最近公司的一个项目里的linux 系统中的oracle 10g数据库&#xff0c;需要把某个表空间里的所有数据都迁移到window 2003的11g里&#xff0c;经过我与dba的交流、测试&#xff0c;决定使用跨平台的表空间传输技术&#xff0c;目前此项任务已经完成&#xff0c;经过测试&#xff…

YY的GCD 莫比乌斯反演

&#xff5e;&#xff5e;&#xff5e;题面&#xff5e;&#xff5e;&#xff5e; 题解&#xff1a; $ans \sum_{x 1}^{n}\sum_{y 1}^{m}\sum_{i 1}^{k}[gcd(x, y) p_{i}]$其中k为质数个数 $$ans \sum_{i 1}^{k}\sum_{x 1}^{n}\sum_{y 1}^{m}[gcd(x, y) p_{i}…

python答辩结束语_Beta答辩总结

前言队名&#xff1a;拖鞋旅游队项目的链接与宣传项目总结原计划实现功能预期完成程度上传照片完美实现照片信息标注在地图上对于有地理信息的照片能够较为精确的定位足迹地图可视化能够用颜色区分出到到每个省份的程度以及显示到达的地点生成旅游故事能够生成不同的故事模板&a…

在一台电脑上使用两个github账号

问题描述&#xff1a; 我公司有一个github账号&#xff0c;每天工作把代码传上去&#xff0c;我觉得代码写的好&#xff0c;我同时想上传到自己的github账号上面去&#xff0c;但是目前只有一台电脑&#xff0c;如何在一台电脑上面进行设置&#xff0c;使这一台电脑可以同时上传…

[唐胡璐]QTP框架 - 关键字驱动测试框架之七 - Settings管理

这里主要是存放一些框架相关的Global设置的相关项&#xff0c;如图所示&#xff1a;转载于:https://www.cnblogs.com/yongfeiuall/archive/2013/03/18/4134155.html

ASP.NET MVC以ValueProvider为核心的值提供系统: DictionaryValueProvider

NameValueCollectionValueProvider采用一个NameValueCollection作为数据源&#xff0c;DictionnaryValueProvider的数据源类型自然就是一个Dictionnary。NameValueCollection和Dictionnary都是一个键值对的集合&#xff0c;它们之间的不同之处在NameValueCollection运行元素具有…

串口 发送 接收 高位_电工进阶PLC大神,必备PLC串口通讯的基本知识!

戳上方蓝字“技成电工课堂”快速关注&#xff01;&#xff01;&#xff01;电力作业人员在使用PLC的时候会接触到很多的通讯协议以及通讯接口&#xff0c;最基本的PLC串口通讯和基本的通讯接口你都了解吗&#xff1f;1&#xff0c;什么是串口通讯&#xff1f;串口是计算机上一种…

HTTP请求时connectionRequestTimeout 、connectionTimeout、socketTimeout三个超时时间的含义...

1.connectionRequestTimout 指从连接池获取连接的timeout 2.connetionTimeout 指客户端和服务器建立连接的timeout&#xff0c; 就是http请求的三个阶段&#xff0c;一&#xff1a;建立连接&#xff1b;二&#xff1a;数据传送&#xff1b;三&#xff0c;断开连接。超时后会Con…

搜索引擎优化培训教程

很详细的搜索引擎优化培训教材 View more presentations from mysqlops 转载于:https://www.cnblogs.com/macleanoracle/archive/2013/03/19/2967982.html

C语言-扫雷游戏

头文件 #ifndef __MINE_H__ #define __MINE_H__#define LINE 10 #define LIST 10 #define ROWS 6 #define COWS 6int game(char UserBoard[LINE2][LIST2], char PlayerBoard[LINE][LIST]); void PrintBoard(char Playerboard[LINE][LIST]); void MineLay(char UserBoard[LINE …

PHP的命令行脚本调用

1.使用PHP命令调用php脚本接受键盘输入然后输出 1 <?php 2 fwrite(STDOUT, "Please input your name:\t"); 3 $name trim(fgets(STDIN)); 4 fwrite(STDOUT, Hello . $name); 5 ?> 2.使用PHP命令调用php脚本并接受参数 1 <?php2 if($ar…

控制输入框只能输入数字

1.将input的属性type改为number 2.这时的输入框会有小箭头&#xff0c; 去掉小箭头的方法&#xff0c;给input添加样式 input::-webkit-outer-spin-button,input::-webkit-inner-spin-button { -webkit-appearance: none;}input[type"number"] { -moz-appearan…

main函数参数,在VS中向命令行添加参数的方法

问题描述 使用main函数的参数&#xff0c;实现一个整数计算器&#xff0c;程序可以接受三个参数&#xff0c;第一个参数“-a”选项执行加法&#xff0c;“-s”选项执行减法&#xff0c;“-m”选项执行乘法&#xff0c;“-d”选项执行除法&#xff0c;后面两个参数为操作数。 例…

2.monotouch 控件的使用

1.我们打开一个xib 右下角会看到如下图所示&#xff1a; 这一部分包含了界面和各种各样的控件。选取一个控件&#xff0c;使用鼠标拖动到界面上即可使用。 2.选中一个控件&#xff0c;该控件的相关信息会在右边进行显示。做出相关设置即可。 3.设置控件属性和绑定控件事件。 首…

python视频延迟严重_【Python】改善 VideoCapture 的影像延迟

许多的范例程序大多仅介绍该如何用 VideoCapture 撷取摄影机的画面&#xff0c;却没有充分说明其隐含的问题。以下示范一个最基本的影像撷取程序。# -*- coding: utf-8 -*-import cv2# ip camera 的撷取路径URL "rtsp://admin:admin192.168.1.1/video.h264"# 建立 V…

CentOS 6.0配置pptp ××× Client和Squid透明网关

目的&#xff1a; 构建一台单网卡Linux网关&#xff08;透明代理&#xff09;&#xff0c;该网关拨入某海外服务器&#xff0c;客户端设定该网关后&#xff0c;网络出口则为海外服务器&#xff0c;实现加速访问一些网站的目的。 环境信息&#xff1a; 硬件&#xff1a;DELL机器…

mysql汉字转拼音函数

-- 创建汉字拼音对照临时表 CREATE TABLE IF NOT EXISTS t_base_pinyin (pin_yin_ varchar(255) CHARACTER SET gbk NOT NULL,code_ int(11) NOT NULL,PRIMARY KEY (code_) ) ENGINEInnoDB DEFAULT CHARSETlatin1;-- 插入数据 INSERT INTO t_base_pinyin (pin_yin_,code_) VAL…

数据挖掘的一些经典算法

数据挖掘能做以下七种不同事情&#xff08;分析方法&#xff09;&#xff1a;数据挖掘能做以下七种不同事情 分类 &#xff08;Classification&#xff09; 估计&#xff08;Estimation&#xff09; 预测&#xff08;Prediction&#xff09; 相关性分组或关联规则&#xff08;…