(十四)json、pickle与shelve模块
任何语言,都有自己的数据类型,那么不同的语言怎么找到一个通用的标准?
比如,后端用Python写的,前端是js,那么后端如果传一个dic字典给前端,前端肯定不认。
所以就有了序列化这个概念。
什么是序列化?
我们把对象(变量)从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling。
序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输进行前后端交互。
反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化,即unpickling。
json、pickle模板都可以实现序列化和反序列化,而我们知道的eval则是反序列化。
json.dumps():将Python对象通通转为字符串
import json
a = 11 #---->'11'
s = 'hello' #---->"hello"------>'"hello"'
l = [1,2] #---->'[1,2]'
dic = {'name':'nick'} #---->{"name":"nick"}----->'{"name":"nick"}' print(json.dumps(a))
print(json.dumps(s))
print(json.dumps(l))
print(json.dumps(dic))
结果:
11 #这四个结果都是字符串
"hello"
[1, 2]
{"name": "nick"}
json.dumps()实际干的两件事:
1.把这个数据中的所有的单引号变为双引号(有单引号就改为双引号,没有就不动)
2.把这个数据变为字符串(在最外面加一对单引号)
json.loads():将字符串转为Python对象(与eval相似)
所以,用json现实文件存储:
import json
dic = {'name':'nick'}
str_dic = json.dumps(dic) #转为字符串
f_write = open('123.txt','w')
f_write.write(str_dic)
f_read = open('123.txt','r')
data = f_read.read()
data = json.loads(data) #转回字典
print(type(data))
print(data)
结果:
<class 'dict'>
{'name': 'nick'}
json
如果我们要在不同的编程语言之间传递对象,就必须把对象序列化为标准格式,比如XML,但更好的方法是序列化为JSON,因为JSON表示出来就是一个字符串,可以被所有语言读取,也可以方便地存储到磁盘或者通过网络传输。JSON不仅是标准格式,并且比XML更快,而且可以直接在Web页面中读取,非常方便。
注意,只有符合json标准格式规范的字符串,才能被解析。在字符串中,json只认双引号,如下
123.txt:
{"name": "nick"} with open('123.txt','r') as f_read:
res = f_read.read()
res = json.loads(res)
print(type(res))
print(res) 结果:<class 'dict'>
{'name': 'nick'} 123.txt:
{'name': "nick"} #单引号不符合json的标准格式 with open('123.txt','r') as f_read:
res = f_read.read()
res = json.loads(res)
print(type(res))
print(res) 结果:报错
pickle
pickle和json的用法几乎一样,只是json是将Python对象转为字符串去存储或传输,而pickle是将Python对象转为字节去存储或传输,所以pickle适用的数据类型更多,比如类、对象。但是这样的需求场景很少,所以一般来说,我们还是用json。
用pickle现实文件存储:
import pickle
dic = {'name':'nick'}
byte_dic = pickle.dumps(dic)
print(byte_dic)
with open('aaa.txt','wb') as f_write: #由于是byte,所以这里要+b
f_write.write(byte_dic) with open('aaa.txt','rb') as f_read:
date = f_read.read()
print(type(date))
date = pickle.loads(date)
print(type(date))
print(date)
结果:
b'\x80\x03}q\x00X\x04\x00\x00\x00nameq\x01X\x04\x00\x00\x00nickq\x02s.'
<class 'bytes'>
<class 'dict'>
{'name': 'nick'}
用eval内置方法可以将一个字符串转成python对象
用eval现实文件存储:
dic = {'name':'nick','age':20}
f_write = open('123.txt','w')
f_write.write(str(dic)) #写入时直接f_write.write(dic)是报错的,必须转为str
f_read = open('123.txt','r')
data = f_read.read()
print(type(data)) #读取是字符串
data = eval(data) #eval转为字典
print(type(data))
print(data)
结果:
<class 'str'>
<class 'dict'>
{'age': 20, 'name': 'nick'}
不过,eval方法是有局限性的,对于普通的数据类型,json.loads和eval都能用,但遇到特殊类型的时候,eval就不管用了,所以就要用json。
用json.dumps()将字典转为字符串是序列化,用json.loads()将字符串转回字典是反序列化
用pickle.dumps()将字典转为字节是序列化,用pickle.loads()将字节转回字典是反序列化
用str()将字典转为字符串是序列化,用eval()将字符串转为字典也是反序列化
shelve
最后,简单了解一下shelve模板,shelve和json、pickle属于同一类,也是用于数据存储和传输。
shelve是将pickle模板再进一步封装,目的就是方便我们使用,可以直接把文件当做一个字典来读和写,也就是直接操作键值对
shelve模块只有一个open函数,返回类似字典的对象,可读可写;key必须为字符串,而值可以是python所支持的数据类型
import shelve #写
f = shelve.open(r'abc.txt') #返回一个类似字典的文件对象
f['name'] = 'nick' #插入键值对
f['info'] = {'age':20,'num':123321} #value是一个字典
f.close() f = shelve.open(r'abc.txt') #读
print(f['info']['age']) #直接当做一个字典来读,二级字典
print(f['name'])
(十四)json、pickle与shelve模块的更多相关文章
- python基础--json,pickle和shelve模块
一.JSON &pickle 用于序列化的两个模块 json,用于字符串 和 python数据类型间进行转换 字符串必须是双引号,不能是单引号 pickle,用于python特有的类型 和 ...
- python pickle 和 shelve模块
pickle和shelve模块都可以把python对象存储到文件中,下面来看看它们的用法吧 1.pickle 写: 以写方式打开一个文件描述符,调用pickle.dump把对象写进去 dn = {'b ...
- python json、 pickle 、shelve 模块
json 模块 用于序列化的模块 json,用于字符串 和 python数据类型间进行转换 Json模块提供了四个功能:dumps.dump.loads.load #!/usr/bin/env pyt ...
- os常用模块,json,pickle,shelve模块,正则表达式(实现运算符分离),logging模块,配置模块,路径叠加,哈希算法
一.os常用模块 显示当前工作目录 print(os.getcwd()) 返回上一层目录 os.chdir("..") 创建文件包 os.makedirs('python2/bin ...
- 第九节:os、sys、json、pickle、shelve模块
OS模块: os.getcwd()获取当前路径os.chdir()改变目录os.curdir返回当前目录os.pardir()父目录os.makedirs('a/b/c')创建多层目录os.remov ...
- python的pickle和shelve模块
python中用于序列化的模块总结 目录 pickle模块 shelve模块 xml模块 pickle模块 介绍 Pickle的问题和所有其他编程语言特有的序列化问题一样,就是它只能用于Python, ...
- 19-[模块]-json/pickle、shelve
1.序列化? 序列化是指把内存里的数据类型转变成字符串,以使其能存储到硬盘或通过网络传输到远程,因为硬盘或网络传输时只能接受bytes (1)把字典保存到文件 data = { 'roles': [ ...
- json&pickle数据序列化模块
用于序列化的模块 json,通用的序列化方式,序列化成为str类型,支持所有语言识别,序列化的数据具有局限性. pickle,python的所有数据类型都可以被序列化,序列化为bites格式,只适用于 ...
- json pickle xml shelve configparser
json:# 是一种跨平台的数据格式 也属于序列化的一种方式pickle和shevle 序列化后得到的数据 只有python才可以解析通常企业开发不可能做一个单机程序 都需要联网进行计算机间的交互 J ...
随机推荐
- uni-app全局属性和方法
全局变量和全局方法是软件开发中常用的技术点! 实现方式大致分为: 1.vuex实现,值变动灵活 2.建立js文件,页面内引用 3.挂载vue实例后使用 4.小程序中的globalData 5.本地存储 ...
- 设置RAC DB归档
1.关闭集群数据库 srvctl stop database -d RAC 2.将节点一设置为归档模式 sqlplus / as sysdba startup mount alter database ...
- 测开之数据类型· 第3篇《列表推导式、字典推导式、2种方式创建生成器》
坚持原创输出,点击蓝字关注我吧 作者:清菡 博客:oschina.云+社区.知乎等各大平台都有. 目录 一.列表推导式 二.字典推导式 三.2种方式创建生成器 1.生成器表达式 2.函数里面,通过 y ...
- robotframework中的参数展开
robot调用关键字传参的方式是用分隔符分开不同参数,如 keyword arg1 arg2 arg3 arg4 当参数中传入了使用@符号的列表变量时,@符号会将列表展开: @{list1}= Cre ...
- 详解Python Google Protocol Buffer
为什么要使用PB? PB(Protocol Buffer)是 Google 开发的用于结构化数据交换格式,作为腾讯云日志服务标准写入格式.因此用于写入日志数据前,需要将日志原始数据序列化为 PB 数据 ...
- Centos8自动挂载U盘移动硬盘解决办法
Centos默认是不能识别NTFS文件系统的U盘.移动硬盘的.查阅了很多资料讲到的都是需要安装ntfs-3g安装包. 安装完后每次插入移动存储介质时,都需要手动去挂载. 作为一个做技术的,如果不能解决 ...
- VS中使用RDLC提示类型不一致
问题描述 错误"基类包括字段"XXXXXXX",但其类型(Microsoft.Reporting.WebForms.ReportViewer)与控件(Microsoft. ...
- Next.js+React聊天室|Next仿微信桌面端|next.js聊天实例
一.项目介绍 next-webchat 基于Next.js+React.js+Redux+Antd+RScroll+RLayer等技术构建的PC桌面端仿微信聊天项目.实现了消息/表情发送.图片/视频预 ...
- springMVC框架连接数据库查询数据
1.框架搭建,创建一个maven项目打war包 web.xml文件 <?xml version="1.0" encoding="UTF-8"?> & ...
- Log4j日志的级别
log4j规定了默认的几个级别:ALL < trace < debug < info < warn < error < fatal < OFF 1)级别之间 ...