在python3中,用于序列化的两个模块:json、pickle。Json提供四个方法,分别是dumps、loads、dump、load;pickle也提供四个方法,即dumps、loads、dump、load。
pickle可存储的数据类型:数字、字符串、列表、元组、集合、字典、函数、类。
pickle常用方法:
(1)pickle.dumps(obj, protocol=None, *, fix_imports=True):把obj对象序列化后,以bytes对象返回,不写入文件;可选参数protocol表示pickler使用的协议。
import pickle
l = [1,2,3,4,5]
tup = (1,2,3,4,5)
dic = {'k1':'v1','k2':'v2','k3':'v3'}
pickle_l = pickle.dumps(l)
pickle_tup = pickle.dumps(tup)
pickle_dic = pickle.dumps(dic)
print(pickle_l)
print(pickle_tup)
print(pickle_dic)
运行结果:
b'\x80\x03]q\x00(K\x01K\x02K\x03K\x04K\x05e.'
b'\x80\x03(K\x01K\x02K\x03K\x04K\x05tq\x00.'
b'\x80\x03}q\x00(X\x02\x00\x00\x00k1q\x01X\x02\x00\x00\x00v1q\x02X\x02\x00\x00\x00k2q\x03X\x02\x00\x00\x00v2q\x04X\x02\x00\x00\x00k3q\x05X\x02\x00\x00\x00v3q\x06u.'
(2)pickle.loads(data, *, fix_imports=True, encoding='ASCII', errors='strict'):将data反序列化,从byte对象转换为Python对象;encoding表示编码方式。
import pickle
l = pickle.loads(b'\x80\x03]q\x00(K\x01K\x02K\x03K\x04K\x05e.')
tup = pickle.loads(b'\x80\x03(K\x01K\x02K\x03K\x04K\x05tq\x00.')
dic = pickle.loads(b'\x80\x03}q\x00(X\x02\x00\x00\x00k1q\x01X\x02\x00\x00\x00v1q\x02X\x02\x00\x00\x00k2q\x03X\x02\x00\x00\x00v2q\x04X\x02\x00\x00\x00k3q\x05X\x02\x00\x00\x00v3q\x06u.')
print(l)
print(tup)
print(dic)
运行结果:
[1, 2, 3, 4, 5]
(1, 2, 3, 4, 5)
{'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}
(3)pickle.dump(obj, file, protocol=None, *, fix_imports=True):序列化对象obj,并将结果数据流写入到文件对象file中。
import pickle
dic = {'k1':'v1','k2':'v2','k3':'v3'}
with open('data.txt','wb') as f:
pickle.dump(dic,f)
with open('data.txt','rb') as f:
print(f.read())
运行结果:
b'\x80\x03}q\x00(X\x02\x00\x00\x00k1q\x01X\x02\x00\x00\x00v1q\x02X\x02\x00\x00\x00k2q\x03X\x02\x00\x00\x00v2q\x04X\x02\x00\x00\x00k3q\x05X\x02\x00\x00\x00v3q\x06u.'
(4)pickle.load(file, *, fix_imports=True, encoding='ASCII', errors='strict'):将文件对象file反序列化,转换为python对象,encoding表示编码方式(ASCII、utf-8、bytes)。
import pickle
dic = {'k1':'v1','k2':'v2','k3':'v3'}
with open('data.txt','wb') as f:
pickle.dump(dic,f)
with open('data.txt','rb') as f:
pic = pickle.load(f,encoding='bytes')
print(type(pic))
print(pic)
运行结果:
<class 'dict'>
{'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}
注;load只能读取一个dump中的对象;但dump可以存取多个对象。