python常用模块之json、pickle模块

什么是序列化?

序列化就是把内存里的数据类型转换成字符,以便其能存储到硬盘或者通过网络进行传输,因为硬盘或网络传输时只接受bytes。

为什么要序列化?

举个例子来说,你在上班打游戏,突然你的领导过来了,你就把游戏给关了,然后你的领导走了,你接着打开了这个游戏,此时游戏又从你上次停止的地方继续运行,你的游戏进度肯定保存到了硬盘上,是以何种形式的呢?游戏过程中产生的数据都是不规律的,可能在关游戏的时候就出现了10个嵌套字典,3个列表的数据集合在内存里,需要存下来?你怎么存?把列表变成文件多行多列的形式报错,那么嵌套字典呢?所以,若是有某种办法可以直接把内存数据存到硬盘上,下次程序再启动,再从硬盘里读到内存里,还是原来的格式的话,那就是极好的。

用于序列化的两个模块

  • json:用于字符串和python数据类型之间的转换
  • pickle:用于python特有的类型和python数据类型之间的转换

我们先假设下有这么个数据:

data = {
"roles":[
{'role':"monster","type":"pig","life":50},
{'role':"hero","type":"关羽","life":80}
]
}

我们想把这个数据保存到文件里,改如何操作呢?

f = open("序列化.txt",'w',encoding='utf-8')
f.write(str(data)) # 以字符串类型写进文件中
f.close()

等等,刚刚不是还在说嵌套字典如何写进文件嘛,那现在已经写进去了本章结束 ,不可能的,因为你要怎么读取呢?

f = open("序列化.txt",'r',encoding='utf-8')
d = f.read()
print(d['roles'])
f.close()

这样写会立马报错,因为d此时是str类型,那么我们应该怎么办呢?

f = open("序列化.txt",'r',encoding='utf-8')
d = f.read()
d = eval(d) # 使用eval可以把字符类型转换为任意类型
print(d['roles']) # 成功了

此时我们可以引出:

  • 把内存数据转换成字符,叫序列化
  • 把字符串转换为内存数据,叫反序列化

json模块

json模块提供了4个功能:dump、dumps、load、loads,其中:dump和dumps叫序列化,load和loads叫做反序列化。

1.json.dumps():把内存数据变成字符串

import json

data = {
"roles":[
{'role':"monster","type":"pig","life":50},
{'role':"hero","type":"关羽","life":80}
]
} d = json.dumps(data)
print(type(d)) # <class 'str'>
print(d) # {"roles": [{"role": "monster", "type": "pig", "life": 50}, {"role": "hero", "type": "\u5173\u7fbd", "life": 80}]}

2.json.dump():不仅把内存数据变成字符串,还把它存到文件里

import json

data = {
"roles":[
{'role':"monster","type":"pig","life":50},
{'role':"hero","type":"关羽","life":80}
]
} f = open('test.json','w') # 首先要打开这个文件,注意:序列化后的文件都是以.json结尾
json.dump(data,f) # 把内存数据序列化到文件中

3.json.loads():把字符串转换成内存数据

import json

data = {
"roles":[
{'role':"monster","type":"pig","life":50},
{'role':"hero","type":"关羽","life":80}
]
} d = json.dumps(data)
d2 = json.loads(d) # 应把data数据注释后运行
print(d2) # {'roles': [{'role': 'monster', 'type': 'pig', 'life': 50}, {'role': 'hero', 'type': '关羽', 'life': 80}]}

4.json.load():把字符串从文件中读取,然后转成内存数据

import json

f = open("test.json",'r')
data = json.load(f)
print(data) # 同样也可以拿到文件

那么此时有一个大疑问,就把内存数据转换成字符串,也不给存放起来,用这个有什么意义?

作用1:把你的内存数据通过网络共享给其他人

作用2:定义了不同语言的交互规则

我们可以使用文本文档、xml、json保存数据,那么它们的区别数是什么?

1.文本文档,缺点:不能共享复杂的数据

2.xml,缺点:占用内存大

3.json,优点:占用空间小,可读性非常好

那么我们可以dump多次和load多次吗?

# dump多次,是可以成功的
import json d = {'name':'alex','age':22}
l = [1,2,3,4,"rain "] f = open("test.json",'w')
json.dump(d,f)
json.dump(l,f)
f.close() # load多次,不能成功
import json f = open("test.json",'r')
d1 = json.load(f)
d2 = json.load(f) # 因为数据是连在一起的,所以没法load多次,即立马报错,raise JSONDecodeError("Extra data", s, end)
f.close()

json本身的设计就是dump一次,load一次的

pickle模块

1.pickle.dumps():将内存数据转换成字符

import pickle
d = {'name':'alex','age':22} s = pickle.dumps(d)
print(s) # b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x04\x00\x00\x00alexq\x02X\x03\x00\x00\x00ageq\x03K\x16u.' # 直接就是bytes类型

2.pickle.loads():将字符转换成为内存数据

import pickle
d = {'name':'alex','age':22} s1 = pickle.dumps(d) s2 = pickle.loads(s1)
print(s2) # {'name': 'alex', 'age': 22}

3.pickle.dump():把内存数据转换成字符,并存到文件中

import pickle
d = {'name':'alex','age':22} f = open("test.pkl","wb")
pickle.dump(d,f)
f.close() 此时文件中就生成pickle自己的格式:€}q (X nameqX alexqX ageqKu.

4.pickle.load():把文件中内容读取出来然后转换成内存数据

import pickle

f = open("test.pkl","rb")
d = pickle.load(f)
print(d) # {'name呢': 'alex', 'age': 22}
f.close()

此时,json和pickle模块都结束了。

有人会问,既然json和pickle的功能是一样的,那么为什么还要存在两个模块呢?

1.都不能dump多次
2.json能做的pickle不能做,pickle能做的json不能做
例如:
json支持的数据类型:int,str,tuple,list,dir,可以跨平台
pickle支持的数据类型:支持python里所有的数据类型
缺点:只能在python中使用

python常用模块之json、pickle模块的更多相关文章

  1. [re模块、json&pickle模块]

    [re模块.json&pickle模块] re模块 什么是正则? 正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法.或者说:正则就是用来描述一类事物的规则 ...

  2. python之os与json&pickle模块

     一.os模块 简单概述一下os模块就是与操作系统交互的一个接口 import os #os.getcwd() print(os.getcwd()) # 获取到当前工作目录 # 运行结果:E:\pyt ...

  3. python 序列化及其相关模块(json,pickle,shelve,xml)详解

    什么是序列化对象? 我们把对象(变量)从内存中编程可存储或传输的过程称之为序列化,在python中称为pickle,其他语言称之为serialization ,marshalling ,flatter ...

  4. python序列化及其相关模块(json,pickle,shelve,xml)详解

    什么是序列化对象? 我们把对象(变量)从内存中编程可存储或传输的过程称之为序列化,在python中称为pickle,其他语言称之为serialization ,marshalling ,flatter ...

  5. 20181205(模块循环导入解决方案,json&pickle模块,time,date,random介绍)

    一.补充内容 循环导入 解决方案: 1.将导入的语句挪到后面. ​ 2.将导入语句放入函数,函数在定义阶段不运行 #m1.pyprint('正在导入m1')   #②能够正常打印from m2 imp ...

  6. Pythoy 数据类型序列化——json&pickle 模块

    Pythoy 数据类型序列化--json&pickle 模块 TOC 什么是序列化/反序列化 pickle 模块 json 模块 对比json和pickle json.tool 命令行接口 什 ...

  7. Python(正则 Time datatime os sys random json pickle模块)

    正则表达式: import re #导入模块名 p = re.compile(-]代表匹配0至9的任意一个数字, 所以这里的意思是对传进来的字符串进行匹配,如果这个字符串的开头第一个字符是数字,就代表 ...

  8. Python Json & Pickle模块

    用于序列化的两个模块 Json,用于字符串 和 python数据类型间进行转换 Pickle,用于python特有的类型 和 python的数据类型间进行转换 Json模块提供了四个功能:dumps. ...

  9. 常用模块---sys&logging&序列化模块(json&pickle)

    sys 模块 sys.argv 命令行参数List,第一个元素是程序本身路径,通常用来避免io 阻塞 print('欢迎进入') info=sys.argv ': print('login succe ...

  10. python模块之json pickle

    1.json模块 功能:将其他形式的数据类型转化为json字符串类型,将json字符串转化为其他对应的数据类型 方法:json.dumps()  作用:将所有单引号变成双引号:将所有数据类型变成字符串 ...

随机推荐

  1. Jquery4 过滤选择器

    学习要点: 1.基本过滤器 2.内容过滤器 3.可见性过滤器 4.子元素过滤器 5.其他方法 过滤选择器简称:过滤器.它其实也是一种选择器,而这种选择器类似 CSS3里的伪类,可以让不支持 CSS3 ...

  2. 谈谈let与const

    let 命令 let命令用于声明变量,但是与传统var命令的不同之处在于拥有以下特性: 使用let命令声明的变量只在let命令所在的代码块内有效(我将之称为变量绑定): 不存在变量提升: 存在暂时性死 ...

  3. MR案例:倒排索引

    1.map阶段:将单词和URI组成Key值(如“MapReduce :1.txt”),将词频作为value. 利用MR框架自带的Map端排序,将同一文档的相同单词的词频组成列表,传递给Combine过 ...

  4. python-运算、分支、深浅拷贝

      算术表达式: + - * / 除法Python3中是默认向浮点数靠拢 //取整运算   结果的最小整数靠拢  向下 5 // 2 = 2(向下取整) %取余运算 5 % 2 = 1 **幂值运算 ...

  5. 4.9版本linux内核的ina220电流检测芯片源码在哪里

    答:在drivers/hwmon/ina2xx.c中,内核配置项为CONFIG_SENSORS_INA2XX Location: -> Device Drivers -> Hardware ...

  6. 常用git代码提交命令

    知识点:本篇博客记录了日常开发中,所涉及到git代码提交命令 (一)初始化本地仓库,提交代码,提交到远程git远程仓库 git init    //初始化本地仓库 git add .   //将当前目 ...

  7. gulp构建例子(ubuntu)

    1.项目结构和生产之后的目录 2.gulpfile.js // 载入插件 var gulp = require('gulp'), //本地安装gulp所用到的地 sass = require('gul ...

  8. c# 过滤HTML代码 源代码,案例 下载

    #region 过滤HTML代码 //替换掉html字符,只显示文字信息. public string replaceHtmlCode(string Htmlstring) { Htmlstring ...

  9. UVA 12063 Zeros and Ones(三维dp)

    题意:给你n.k,问你有多少个n为二进制的数(无前导零)的0与1一样多,且是k的倍数 题解:对于每个k都计算一次dp,dp[i][j][kk][l]表示i位有j个1模k等于kk且第一位为l(0/1) ...

  10. 在.Net中进行SQL Server数据库备份与还原操作实用类

    #region 类说明 //----------------------------------------------------------------------------- // // 项目 ...