为什么需要序列化
-
便于存储。序列化过程将文本信息转变为二进制数据流。
-
便于传输。当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。
序列化
pickle.dump()
pickle.dump(obj, file, protocol=None,*,fix_imports=True)
- 序列化后的对象obj以二进制形式写入文件file中,进行保存。它的功能等同于 Pickler(file, protocol).dump(obj)。
- 数file,有一点需要注意,必须是以二进制的形式进行操作(写入)
pickle.dumps()
pickle.dumps(obj, protocol=None,*,fix_imports=True)
pickle.dumps()
方法跟pickle.dump()
方法的区别在于,pickle.dumps()
方法不需要写入文件中,它是直接返回一个序列化的bytes对象。
Pickler(file, protocol).dump(obj)
pickle.Pickler(file, protocol=None,*,fix_imports=True)
实现的功能跟 pickle.dump()
是一样的
反序列化
pickle.load()
pickle.load(file, *,fix_imports=True, encoding=”ASCII”. errors=”strict”)
- 将序列化的对象从文件file中读取出来。它的功能等同于 Unpickler(file).load()。
pickle.loads()
pickle.loads(bytes_object, *,fix_imports=True, encoding=”ASCII”. errors=”strict”)
- 直接从bytes对象中读取序列化的信息,而非从文件中读取。
unpickler(file).load()
pickle.Unpickler(file, *,fix_imports=True, encoding="ASCII". errors="strict")
- 功能跟 pickle.load() 是一样的
实例
#coding:utf-8
__author__ = 'MsLili'
#pickle模块主要函数的应用举例
import pickle
dataList = [[1, 1, 'yes'],
[1, 1, 'yes'],
[1, 0, 'no'],
[0, 1, 'no'],
[0, 1, 'no']]
dataDic = { 0: [1, 2, 3, 4],
1: ('a', 'b'),
2: {'c':'yes','d':'no'}}
#使用dump()将数据序列化到文件中
fw = open('dataFile.txt','wb')
# Pickle the list using the highest protocol available.
pickle.dump(dataList, fw, -1)
# Pickle dictionary using protocol 0.
pickle.dump(dataDic, fw)
fw.close()
#使用load()将数据从文件中序列化读出
fr = open('dataFile.txt','rb')
data1 = pickle.load(fr)
print(data1)
data2 = pickle.load(fr)
print(data2)
fr.close()
#使用dumps()和loads()举例
p = pickle.dumps(dataList)
print( pickle.loads(p) )
p = pickle.dumps(dataDic)
print( pickle.loads(p) )