为啥叫pickle
pickle作名词有泡菜、腌菜的意思,作动词是“腌渍”、“酸洗”、“破坏”。在python中pickle的对象是当前环境的任何obj。
简单来说就是现在程序运行一半了,可能有list,有dictionary,有各种已经被赋值的变量。现在我如果想把这些变量打包存下来,以后再读取,或者是给其他程序读取这些变量的值,这时候就可以用pickle.dump()把这些对象转化成二进制的文本存到一个文件里。
pickle.dump()
存储过程叫做pickling(序列化),该过程中Python对象→字节流,形象一点就是把一个个Python对象“腌”一下,分解成二进制流存起来。用的方法就是pickle.dump(),dump就是“倾倒”、“临时堆积处”,很形象。
用法:
pickle.dump(obj, file, [,protocol])
- obj:要序列化的Python对象
- file:要存的文件对象(是文件对象不是文件路径,所以需要先用open()打开)
- protocol:序列化使用的协议。如果该项省略,则默认为0。如果为负值或HIGHEST_PROTOCOL,则使用最高的协议版本。这里有个坑,就是之后读取的时候Python2.x和3.x不太一样,存的时候无所谓。
例子:
import pickle
dataList = [[1, 1, 'yes'],
[1, 1, 'yes'],
[1, 0, 'no'],
[0, 1, 'no'],
[0, 1, 'no']]
# dump存储目标必须是文件对象,而不能是文件路径
fw = open('dataFile.txt','wb')
# Pickle the list using the highest protocol available.
pickle.dump(dataList, fw, -1)
fw.close()
pickle.load()
读取的过程就是unpickling(反序列化),根据二进制文件重建Python对象,获取数据。
用法:
version = platform.python_version_tuple()
if version[0] == '2':
return pickle.load(f)
elif version[0] == '3':
# 需要使用encoding='latin1'
# 来取消拾取由python 2处理的numpy数组和date time、日期和时间实例。
return pickle.load(f, encoding='latin1')
raise ValueError("invalid python version: {}".format(version))