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}
未完。。。