Python中的Pickle操作(pkl文件解释)

标签:#python##序列化# 时间:2019/03/11 16:43:55 作者:小木

作为数据科学家,您将以字典(dict)、数据框(DataFrame)或任何其他数据类型的形式使用数据集。 使用它们时,您可能希望将它们保存到文件中,以便以后可以使用它们或将它们发送给其他人。 这就是Python的pickle模块的用途:它将对象序列化,以便将它们保存到文件中,并在以后再次加载到程序中。

什么是Pickle?

您刚刚经历了一个耗时的过程,将一堆数据加载到python对象中。 也许你从数千个网站上爬取了数据。也许你计算了pi的数值。如果您的笔记本电脑电池耗尽或python崩溃,您的信息将丢失。

Pickling允许您将python对象保存为硬盘驱动器上的二进制文件。 在你pickle你的对象后,你可以结束你的python会话,重新启动你的计算机,然后再次将你的对象加载到python中。

如果需要,您可以将您的pickle文件备份到Google Drive或DropBox或普通的USB存储中。 你可以发邮件给朋友。

一句警告:不要加载你不信任的pkl文件。 恶意的人可以制作恶意的pkl文件,可能会在您的计算机上执行意外的代码(SQL注入,密码暴力强制等)。

Pickle用于序列化和反序列化Python对象结构,也称为marshalling或flattening。 序列化是指将内存中的对象转换为可以存储在磁盘上或通过网络发送的字节流的过程。之后,这个字符流可以被检索并将其反序列化回Python对象。 Pickle不要与压缩相混淆! 前者是将对象从一种表示(随机存取存储器(RAM)中的数据)转换为另一种表示(磁盘上的文本),而后者是使用较少位编码数据的过程,以节省磁盘空间。

Pickle可以做什么?

对于需要在数据中保持一定程度持久性的应用程序,Pickling非常有用。 您的程序的状态数据可以保存到磁盘,因此您可以稍后继续处理它。 它还可用于通过传输控制协议(TCP)或套接字连接(Socket)发送数据,或将python对象存储在数据库中。 当您使用机器学习算法时,Pickle非常有用,您可以将它们保存在以后能够进行新的预测,而无需重新编写所有内容或重新训练模型。

什么时候不能使用Pickle?

如果要使用不同编程语言的数据,建议不要使用pickle。 它的协议特定于Python,因此不保证跨语言兼容性。 对于不同版本的Python本身也是如此。 不同版本的Python中反序列化Pickle的文件可能并不总是正常工作,因此您必须确保使用相同的版本并在必要时执行更新。您最好不要从不受信任的来源中取消数据。因为解压缩时可能会执行文件中的恶意代码。

用Pickle存储数据

哪些对象可以用Pickle方式存取?

您可以使用以下数据类型来pickle对象:

布尔值,
整数,
花车,
复数,
(普通和Unicode)字符串,
元组,
列表,
集合,和
获取可选对象的字典。
以上所有内容都可以进行Pickle操作,但您也可以对类和函数执行相同的操作,例如,如果它们是在模块的顶层定义的。

然而,并非所有东西都可以被轻易Pickle:例如,生成器,内部类,lambda函数和默认值。 对于lambda函数,您需要使用名为dill的附加包。 使用defaultdicts,您需要使用模块级函数创建它们。

代码示例

保存对象到pickle文件中:
  1. import pickle
  2. # make an example object to pickle
  3. some_obj = {'x':[4,2,1.5,1], 'y':[32,[101],17], 'foo':True, 'spam':False}
  4. with open('mypickle.pickle', 'wb') as f:
  5. pickle.dump(some_obj, f)
  6. # note that this will overwrite any existing file
  7. # in the current working directory called 'mypickle.pickle'
从pkl文件中读取对象:
  1. with open('mypickle.pickle') as f:
  2. loaded_obj = pickle.load(f)
  3. print 'loaded_obj is', loaded_obj
使用Pandas操作DataFrame的序列化
  1. import pandas as pd
  2. df = pd.DataFrame([range(11), range(100,110)], columns=list('abcdefghijk'))
  3. df.to_pickle('my_df.pickle')
  4. df2 = pd.read_pickle('my_df.pickle')

本文翻译自:
https://ianlondon.github.io/blog/pickling-basics/
https://www.datacamp.com/community/tutorials/pickle-python-tutorial

欢迎大家关注DataLearner官方微信,接受最新的AI技术推送
Back to Top