Python序列化(json、pickle、shelve)

序列化-------转向一个字符串数据类型的过程

从数据类型 ---->字符串的过程 叫做序列化
从字符串----->其他数据类型的过程 叫做反序列化

字符串在哪用?
写文件,数据存储
网络上传输的时候

1**、json** 通用的序列化格式*****
只有很少的一部分数据类型可以转化为字符串
2、pickle ****
#所有的Python中的数据类型都可以转换为字符串类型
#pickle序列化的内容只有Python理解
#且部分反序列化依赖Python代码
3、shelve 特点:好操作
有序列化句柄,使用序列化句柄操作

注:有些代码块不能同时运行,需注意何时注释掉

#1、json
可以序列化的数据类型:数字,字符串,列表,字典,元组(转化为列表)

dumps序列化方法 loads反序列化方法

dic={'k1':'v1'}
print(dic,type(dic))#dict
import json
strd=json.dumps(dic)#序列化
print(strd,type(strd))#string

dic_d=json.loads(strd)#反序列化
print(dic_d,type(dic_d))

在这里插入图片描述

dump 、load 和dumps、loads相似,只是前者和文件进行了关联
json dunmp load
注:只能一次性写进去,一次性读出来

dic={1:'a',2:'b'}
f=open('a.txt','w',encoding='utf-8')
json.dump(dic,f,ensure_ascii=False)
json.dump(dic,f,ensure_ascii=False)#再写入一条 ,会出错
   #如果写进去多次,load的时候就会报出这样错json.decoder.JSONDecodeError: Extra data: line 1  
f=open('a.txt')
result=json.load(f)
print(result,type(result))
f.close()

2、pickle

可以序列化任何数据类型

dumps,loads


import  pickle
ddic={'k1':'v1','k2':'v2','k3':'v3'}
str_ddic=pickle.dumps(ddic)
print(str_ddic)#序列化之后得到一串二进制内容

dic2=pickle.loads(str_ddic)
print(dic2,type(dic2))#得到字典

dump,load
时间类型,也可序列化,也可分布dump 分布load,这json形成对比

import time
struct_time=time.localtime(1000000000)
print(struct_time)

f=open('c.txt','wb')
pickle.dump(struct_time,f)
f.close()

f=open('c.txt','rb')
struct_time2=pickle.load(f)
print(struct_time2)
f.close()

3、shelve

会创建好几个文件
在这里插入图片描述

import shelve

‘’’
由于shelve在默认的情况下不会记录持久化 对象的任何修改,所以我们再
shelve.open()的时候修改默认参数,否则对象 的修改不会保存

'''
 f=shelve.open('shelve_file')
  f['key']={'int':10,'float':9.5,'string':'sample data'}#z直接对文件句柄操作,就可以
  f.close()
#
  import shelve
  f1=shelve.open('shelve_file')
  existing =f1['key']#取数据的时候也只需要直接用key获取即可,但如果key也不存在也会报错
  f1.close()
  print(existing)

修改

import shelve
f2=shelve.open('shelve_file')#没有改默认参数,修改后不会改
print(f2['key'])
f2['key']['newvalue']='thishisf'#修改值
f2.close()

f2=shelve.open('shelve_file',writeback=True)#这里修改默认参数,修改后的内容可以保存
print(f2['key'])
f2['key']['newvalue']="woshinibaba"#修改值
f2.close()

‘’’
writeback有有点也有缺点。
优点是:减少了我们的出错概率,并且让对象持久化对用户更透明化;
但是这种方式并不是所有情况都需要,首先,使用writeback以后,
shelf在open的时候会增加额外的内存消耗,并且当DB在close()的时候
会将缓存中的每一个对象都写入DB,这也会带来额外的等待时间,以为
shelve没有办法知道缓存中哪些对象修改了,哪些没有修改,因此所有对象斗湖被写入。
‘’’

这三种方式只有json 可以直接从文件里看出内容是什么

猜你喜欢

转载自blog.csdn.net/qq_39062888/article/details/89342939