在机器学习中,我们常常需要把训练好的模型存储起来,这样在进行决策时直接将模型读出,而不需要重新训练模型,这样就大大节约了时间。Python提供的pickle模块就很好地解决了这个问题,它可以序列化对象并保存到磁盘中,并在需要的时候读取出来,任何对象都可以执行序列化操作。
1.pickle.dump(obj, file, protocol=None, *, fix_imports=True)
【作用】将obj的pickled对象写入打开的文件对象file中
obj:是需要序列化处理的对象
file:文件对象,必须有一个write()方法,该方法接受一个字节参数。因此,它可以是为二进制文件打开的文件对象写入、io.BytesIO实例或其他自定义对象。
protocol:告诉pickler对象使用给定的协议,它能够支持的协议有0、1、2、3、4。违约协议是3,为Python 3设计的向后不兼容协议。貌似是为了兼容性考虑的一个参数,不常用。
fix_imports:如果*fix_imports*为真且协议小于3,pickle将尝试将新的Python 3名称映射到Python中使用的旧模块名称2,这样pickle数据流可以用Python 2读取。也是为了兼容性考虑,这里不做赘述了。默认设置可以达到兼容需求。
pickle.dumps(obj, protocol=None, *, fix_imports=True)
【作用】将对象的pickled表示形式(obj)返回为bytes对象。
参数同pickle.dump方法
2.pickle.load(file, *, fix_imports=True, encoding='ASCII', errors='strict')
这里并没有protocol参数,这是因为pickle的协议版本是自动检测的,超过pickled对象的字节数表示将被忽略。
【作用】从存储在文件中的pickle数据读取并返回对象
file:必须有两个方法,一个read(intNumber)方法和一个readline()方法。两个方法都应该返回字节,因此该参数可以是打开要读取的二进制文件对象、io.BytesIO对象或任何符合条件的自定义对象。
fix_imports、encoding、errors:这三个参数可选,用于控制pickle流的兼容性支持。如果fix-imports为真,pickle将尝试将旧的Python 2名称映射到Python 3中使用的新名称。encoding、errors参数告诉pickle如何解码8位字符串,默认解码方式和容错机制为“ASCII”和“strict”。也是为了兼容性考虑,不常用。
pickle.loads(data, *, fix_imports=True, encoding='ASCII', errors='strict')
【作用】从给定的pickle数据读取并返回对象。
参数作用用法参照pickle.loads()方法。
(3)pickle.dumps(obj[, protocol])
函数的功能:将obj对象序列化为string形式,而不是存入文件中。
参数讲解:
- obj:想要序列化的obj对象。
- protocal:如果该项省略,则默认为0。如果为负值或HIGHEST_PROTOCOL,则使用最高的协议版本。
(4)pickle.loads(string)
函数的功能:从string中读出序列化前的obj对象。
参数讲解:
- string:文件名称。
【注】 dump() 与 load() 相比 dumps() 和 loads() 还有另一种能力:dump()函数能一个接着一个地将几个对象序列化存储到同一个文件中,随后调用load()来以同样的顺序反序列化读出这些对象。