把内存数据转成字符,叫序列化;把字符转成内存数据类型,叫反序列化。
Json模块
Json模块提供了四个功能:序列化:dumps、dump;反序列化:loads、load。
import json data = { 'roles':[ {'role':'monster','type':'pig','life':50}, {'role':'hero','type':'关羽','life':80} ] } #dumps和loads d = json.dumps(data) #仅转成字符串 d2 = json.loads(d) #dump f = open('test.json','w') json.dump(data,f) #转成字符串后直接写入文件,文件名后默认加上 .json 来说明这个文件是通过json转过的 #load f = open('test.json','r') data = json.load(f)
只是把数据类型转成字符串存在内存里的意义? json.dumps json.loads
1.把你的内存数据 通过网络 共享给远程其他人,只能用bytes格式
2.定义了不同语言之间的交互规则
1.纯文本,坏处:不能共享复杂的数据类型
2.xml 坏处:占空间大
3.json 好处:简单,可读性好
注:dump 可以 dump 多次,但是在 dump 多次之后,不能 load,因为数据类型不同的时候,没有办法识别是什么数据类型,无法处理。
pickle模块
import pickle d = {'name':'alex','age':22} l = [1,2,3,4,'rain'] #dumps pickle.dumps(d) #d为bytes类型 #loads d = pickle.dumps(d) pickle.loads(d) #dump pk = open('data.pkl','wb') pickle.dump(d,pk) #打开文件的时候,因为文件是bytes,必须以 'wb' 的格式打开 #load f = open('data.pkl','rb') d = pickle.load(f)
json VS pickle
Json:
优点:跨语言、体积小
缺点:只能支持int,str,list,tuple,dict
Pickle:
优点:专为python设计,支持python所有的数据类型
缺点:只能在python中使用(不能跨平台),存储数据占空间大
shelve 模块
shelve模块是一个简单的(k,v)将内存数据通过文件持久化的模块,可以持久化任何pickle可支持的python数据格式。
pycharm里写入:
import shelve f = shelve.open('shelve_test') #打开一个文件,不需要写打开模式 names = ["alex", "rain", "test"] info = {'name': 'alex', 'age': 22} f["names"] = names #持久化列表,并不要求前后名字一致 f['info_dic'] = info f.close()
cmd里打开、获取
>>> import shelve >>> f = shelve.open('shelve_test') #打开文件 >>> f.keys() KeysView(<shelve.DbfilenameShelf object at 0x0000022D92FF7128>) >>> list(f.keys()) ['names', 'info_dic'] >>> list(f.items()) [('names', ['alex', 'rain', 'test']), ('info_dic', {'name': 'alex', 'age': 22})] >>> f.get('names') #不会冲突,可以随意获取 ['alex', 'rain', 'test'] >>> f.get('info_dic') {'name': 'alex', 'age': 22} >>> f['names'] ['alex', 'rain', 'test'] >>> del f ['names'] #可以进行删除操作 >>> f.close() #删除后先关掉,再重新打开 >>> f = shelve.open('shelve_test') >>> f.get('names') >>> f['scores'] = [1,3,4,5,6] #可以添加 >>> f['scores'] [1, 3, 4, 5, 6] >>> f['scores'] = [1,3,'A',5,6] #可以整个赋值,不能对其中的元素进行修改 >>> f['scores'] [1, 3, 'A', 5, 6]