6. json & pickle & shelve & xml 序列化模块

1) 什么是序列化

我们把对象(变量)从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling,在其他语言中也被称之为serialization,marshalling,flattening等

2) json 模块

json表示出来就是一个字符串,可以被所有语言读取,也可以方便地存储到磁盘或者通过网络传输。JSON不仅是标准格式,并且比XML更快,而且可以直接在Web页面中读取,非常方便

①将一个字典格式数据进行序列化(存储为json格式)

#注意res1 和res2的区别,虽然json也是str格式, json格式不识别单引号,只识别双引号
import json
res1 = json.dumps(dic)
print(res1)          #{"a": 1}
print(type(res1))    #<class 'str'>

res2 = str(dic)
print(res2)         #{'a': 1}
print(type(res2))   #<class 'str'>

②将数据进行序列化,并存储到文件中,有2种方法:json.dumps(str),传入的是字符串;json.dump(file),传入的是文件

#方法1:json.dumps(),传入的是字符串
user = {'name':'egon','age':18,'nb':True}
with open('user.json','w',encoding='utf-8') as f:
    f.write(json.dumps(user))

#方法2:json.dump(),传入的是文件
json.dump(user,open('user_new.json','w',encoding='utf-8'))

③读取json数据格式文件,有2种方法:json.loads(str),读取的是字符串;json.load(file),读取的是文件

#方法1:json.loads(),传入的是字符串
with open('user.json','r',encoding= 'utf-8') as f:
user1 = json.loads(f.read()) #此时user1是一个字典类型
    print(user1['name'])    #egon

#方法2:json.load(),传入的是文件
user1 = json.load(open('user.json','r',encoding='utf-8'))
print(user1['name'])    #egon

3) pickle 模块

pickle与json的异同点:

不同:pickle可以序列化json不能处理的数据,pickle 可以序列化等号右边的所有的类型
相同:序列化函数(dumps,dump),反序列化函数(loads,load)

①将一个集合格式数据进行序列化(存储为pickle格式)

import json
import pickle
s={1,2,3,4}
#print(json.dumps(s))    #报错:ypeError: Object of type 'set' is not JSON serializable
print(pickle.dumps(s))   #bytes类型

②将数据进行序列化,并存储到文件中,有2种方法:pickle.dumps(str),传入的是字符串;pickle.dump(file),传入的是文件

#方法1:pickle.dumps(),传入的是字符串
with open('s.pkl','wb') as f:
    f.write(pickle.dumps(s))

#方法2:pickle.dump(),传入的是文件
pickle.dump(s,open('s.pkl','wb'))

③读取pickle数据格式文件,有2种方法:pickle.loads(str),读取的是字符串;pickle.load(file),读取的是文件

#方法1:pickle.loads(),传入的是字符串
s={1,2,3,4}
with open('s.pkl','rb') as f:
res = pickle.loads(f.read())
print(res)  #{1, 2, 3, 4}

#方法2:pickle.load(),传入的是文件
s={1,2,3,4}
res2 = pickle.load(open('s.pkl','rb'))
print(res2) #{1, 2, 3, 4}

未完。。。

posted @ 2018-01-14 23:47  丢失固执  阅读(106)  评论(0编辑  收藏  举报