pickle和cPickle
最近在Dex-Net的源码中看到他们使用cPickle模块进行数据的缓冲,于是决定学习一下pickle模块
cPickle模块是python2标准库中自带的,在python3中变成了pickle,模块在标准库中API文档如下
https://docs.python.org/3/library/pickle.html
其中详细介绍了该模块的使用方法,pickle主要用来存储python对象,pickle把python对象存储为二进制字节流的形式,相比使用json,pickle可以对任意的python对象进行存储,包括自己定义的python对象。
要使用这个模块主要有以下四个接口函数。
- pickle.dump(obj, file, protocol=None, *, fix_imports=True)
把python对象写入一个文件,file是一个打开文件,必须拥有单字节的write()方法。
import pickle
# An arbitrary collection of objects supported by pickle.
data = {
'a': [1, 2.0, 3, 4+6j],
'b': ("character string", b"byte string"),
'c': {None, True, False}
}
with open('data.pickle', 'wb') as f:
# Pickle the 'data' dictionary using the highest protocol available.
pickle.dump(data, f, pickle.HIGHEST_PROTOCOL)
- pickle.dumps(obj, protocol=None, *, fix_imports=True)
把python对象转换为pickle字节流并返回,而不是写入文件 - pickle.load(file, *, fix_imports=True, encoding=“ASCII”, errors=“strict”)
从文件中加载一个python对象,该文件必须拥有read()和readline()方法,在解析numpy数组时需要设置encoding=‘latin1’,更多细节见API文档
import pickle
with open('data.pickle', 'rb') as f:
# The protocol version used is detected automatically, so we do not
# have to specify it.
data = pickle.load(f)
- pickle.loads(bytes_object, *, fix_imports=True, encoding=“ASCII”, errors=“strict”)
从一个字节流对象中加载一个python对象