Python的pickle模块实现了基本的数据序列和反序列化。
序列化就是把一个对象变成二进制内容,就是一个byte[]数组。为什么需要序列化?因为序列化后可以把byte[]内容保存到文件中,也可以通过网络传输到远程。
有序列化就有反序列化,也就是把存储到文件中或者从网络上读取的二进制内容 即byte[]数组 变回对象。
基本使用方法
pickle.dump(obj,file,[,protocol])
- 功能:将对象obj保存到文件file中去。
- file必须有write接口。如果protol>=1,文件对象需要以二进制模式打开。
- protocol为序列化使用的协议版本,默认为0。0表示ASCII协议,即序列化的对象使用ASCII码表示;1表示老式的二进制协议;2表示新的二进制协议,较以前的更高效。其中协议0和1兼容老版本的python。
pickle.load(file)
- 功能:从file中读取字符串,并将其重构为原python对象
- file有read()和readline()接口
使用举例
import pickle
data1 = {'A' : [0,1,2,3],'B':'Nice to meet you!','C':None}
print(data1)
Out[13]: {'A': [0, 1, 2, 3], 'B': 'Nice to meet you!', 'C': None}
file = open('data1.pkl','wb') # 如果不存在data1.pkl,将会在本路径下自动创建一个可写文件
pickle.dump(data1,file) # 将data1对象序列化存入file
file.close() # 及时关闭文件
file_read = open('data1.pkl','rb') # 可读方式打开文件
print(file_read)
Out[10]: <_io.BufferedReader name='data1.pkl'>
data1_read = pickle.load(file_read) # 从文件中读取内容
print(data1_read)
Out[12]: {'A': [0, 1, 2, 3], 'B': 'Nice to meet you!', 'C': None}
file_read.close() # 及时关闭文件
文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的。
且文件读写时都有可能产生error,一旦出错,后面的.close()就不会调用。所以为了保证无论是否出错都能正确关闭文件。
python引入了with语句来自动帮助调用close()方法。
with open(path,'rb') as f:
...把f当成以上的file来使用
举例
with open('data1.pkl','rb') as f: # 打开文件'data1.pkl'
data_read = pickle.load(f) # 不需要调用close()函数
print(data_read)
{'A': [0, 1, 2, 3], 'B': 'Nice to meet you!', 'C': None}