(十四)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'])

 

转载于:https://www.cnblogs.com/xulan0922/p/10204034.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值