序列化模块(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'])
posted @ 2019-04-11 13:38  DF-包子  阅读(143)  评论(0)    收藏  举报