序列化和反序列化的理解:
序列化:把对象(变量)从内存中变成可存储或者传输的过程,在python中叫pickling,序列化之后,就可以把序列化之后的内容存储到磁盘或者通过网络传输到其他机器上。
反序列化:从磁盘中将序列化后的内容读取到内存中 称为unpickling
经常作为序列化以及反序列化的几个模块:json pickle shelve
首先讲解json模块,也是用的最多的一个模块
json之序列化函数dumps
import json
dict = {'name':'python','age':'18'}
f = open('json_test','w')
date = json.dumps(dict)
f.write(date)
f.close()
json之反序列化函数loads
import json
f = open('json_test','r')
data = f.read()
date = json.loads(data)
print(date)
print(date['name'])
因为json支持的对象类型有限,例如不支持函数名变量,而pickle模块支持的对象类型比较多,比如就支持函数名变量。其他对象类型的操作方法跟json中的一样,只需要把json替换成pickle就可以。
现在来看一下pickle支持的函数名变量
import pickle
def foo():
print('I am foo fun')
f = open('pickle_fun_test','wb')
data = pickle.dumps(foo)
f.write(data)
f.close()
这里要注意一下,pickle序列化是以字节形式存储的,json是以字符串存储的。所有打开文件的时候要用wb模式。
import pickle
def foo():
print('I am foo fun')
f = open('pickle_fun_test','rb')
data = f.read()
fun1 = pickle.loads(data)
fun1()
f.close()
这里扩展一下:这两个模块还有两个方法是dump和load方法,dump方法相当于自动写进磁盘dump(dict,fp),load方法相当于自动读取文件内容,load(fp)。
shelve模块就只有一个函数,open函数,返回一个类似于一个字典对象的对象。举例如下:
import shelve
f = shelve.open('shelve_text')
#添加数据
f['info']={'name':'python','age':'18'}
#获取数据
data = f.get('info')
print(data)