序列化模块(json,pickle,shelve)
序列化模块
json模块,将一个对象转换成能永久存储的内容,它是多种语言通用的一个模块,
主要用于字符串和python数据类型之间的转换,通过dump,load.dumps,loads四个功能来实现
dump:对象转换成文件-->序列化-->dump(要转的内容,文件句柄)-->可见文件
load:文件转换成对象-->反序列化-->load(文件句柄)-->对象
import json
dic = {'name':'meet','age':'18'} f = open('test.txt','w',encoding='utf-8') s = json.dump(dic,f)) print(s) n = json.load(f) print(n) lst = [1,2,3,4,5,6] f = open('test.txt','w',encoding='utf-8') s1 = json.dump(lst,f)) print(s1) n1 = json.load(f) print(n)
dumps:将对象转换成字符串-->序列化-->dumps(要转换的对象)-->字符串
loads:将字符串转换成对象-->反序列化-->loads(要转化的字符串)-->对象
import json
dic = {'name':'meet','age':18} s = json.dumps(dic) print(type(s),s) class:'str',{"name":"meet","age":18} n = json.loads(s) print(type(n),n) class:'dic',{'name':'meet','age':18}
json的格式化输出:
data = {'username':['李华',[1,2,3],'二愣子'],'sex':'male','age':16}
json_dic2=json.dumps(data,sort_keys=True,ensure_ascii=False,indent=2,separators=(',',':'))
ps:
Skipkeys:默认值是False,如果dict的keys内的数据不是python的基本类型(str,unicode,int,long,float,bool,None),设置为False时,就会报TypeError的错误。此时设置成True,则会跳过这类key
keys:设置为False时,就会报TypeError错误,如果设置成True,就会跳过
sort_keys:根据keys的值进行排序
ensure_ascii:为True时,非ascii码字符显示为\u...,设置成False,中文就可以显示
indent,如果是0,就顶格分行显示,如果为空,就一行紧凑显示,否则就换行并按照indent的数值显示空格
separators:分隔符,实际上是(item_separator,dict_separator)的一个元组,默认的就是(',',':');
这表示dictionary内keys之间用","隔开,而Key和value之间用":"隔开。
pickle模块
pickle模块,将一个对象转换成能永久存储的内容,它是python特有的模块类型,可以把目前所知(除lambda以外)的数据类型进行转换,
主要通过dump,load.dumps,loads四个功能来实现
dump:对象转成文件-->序列化-->dump(要转换的对象,文件句柄)-->文件(不可见)
load:文件转换为对象-->反序列化-->load(文件句柄)-->对象
f = open('文件名','wb')
dic = {1:2,2:3}
pickle.dump(dic,f)
f = open('文件名','rb')
s = pickle.load(f)
print(type(s),s)
dumps:对象转换成字节-->序列化-->dumps(要转换的对象)-->字节
loads:字节转换成对象-->反序列化-->loads(要转换的字节)-->对象
dic = {'name':'yiyi','age':18}
s = pickle.dumps(dic)
print(type(s),s) class:bytes,b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x04\x00\x00\x00yiyiq\x02X\x03\x00\x00\x00ageq\x03K\x12u.'
c = pickle.loads(s)
print(type(c),c) class:dic,{'name':'yiyi','age':18}
shelve
使用场景:没有强调使用固定的序列化,就可以使用shelve,shelve是基于pickle实现的
import shelve
f = shelve.open('ss') 创建了一个字典
f['name'] = 'alex' 字典的增加,字典的键必须是字符串,值没有要求
f['age'] = 999
print(f) 一个内存地址
print(f['name']) 字典的查看
print(f.get('name'))
f.pop('age') 删除
只能通过for来看:
for i in f:
print(i)
for i in f.keys():
print(i)
拿到的都是字典的键
for k,v in f.items():
print(k,v)
避坑操作
如果出现报错,有一个是回写错误,还有一个就是flag = r
import shelve
f = shelve.open('ss')
f['name'] = '小一'
f.close()
f1 = shelve.open('ss',writeback = True)
f1['name'] = '小二'
f1.close()
f = shelve.open('ss')
print(f['name'])
如果出现了回写不成功,在open中添加(writeback = True)
(只读)
import shelve
f = shelve.open('ss')
f['name'] = '小一'
f.close()
f1 = shelve.open('ss',flag = 'r')
f1['name'] = '小二'
f1.close()
f = shelve.open('ss')
print(f['name'])

浙公网安备 33010602011771号