python——pickle模块的使用 超、凢脫俗 2023-01-10 03:51 94阅读 0赞 # 简介 # pickle提供了一个简单的持久化功能。可以将对象以文件的形式存放在磁盘上。 pickle模块只能在python中使用,python中几乎所有的数据类型(列表,字典,集合,类等)都可以用pickle来序列化, pickle序列化后的数据,可读性差,人一般无法识别。 # 常用函数 # `pickle.dump(obj, file[, protocol])` 序列化对象,并将结果数据流写入到文件对象中。参数protocol是序列化模式,默认值为0,表示以文本的形式序列化。protocol的值还可以是1或2,表示以二进制的形式序列化。 `pickle.load(file)` 反序列化对象。将文件中的数据解析为一个Python对象。 # 实例 # import pickle # 要存储的信息 some_obj = { 'x':[4,2,1.5,1], 'y':[32,[101],17], 'foo':True, 'spam':False} # 将信息存到 mypickle.pickle # .mo这个后缀可以随便写 with open('mypickle.mo', 'wb') as f: pickle.dump(some_obj, f) with open('mypickle.mo','rb') as f: loaded_obj = pickle.load(f) print(loaded_obj) **注意:** 代码中的`.mo`文件后缀可以随便写,注意在读取的时候保持一致就行 看我生成的文件 ![在这里插入图片描述][20210122184940931.png] ## 可能会产生的错误 ## 注意代码中的下面这句 with open('mypickle.mo','rb') as f 如果不写`rb`,可能会引起下面的错误 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0dhYnJpZWxfd2Vp_size_16_color_FFFFFF_t_70] # 参考 # [python——pickle模块的详解][python_pickle] 以下内容来自 [Python中的Pickle操作(pkl文件解释][Python_Pickle_pkl] # 什么是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,您需要使用模块级函数创建它们。 [20210122184940931.png]: /images/20221119/693f79cd07e840b8ba606b9c40fa1e5a.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0dhYnJpZWxfd2Vp_size_16_color_FFFFFF_t_70]: /images/20221119/25f0c1f958f742619dda8554cbd29976.png [python_pickle]: https://www.cnblogs.com/baby-lily/p/10990026.html [Python_Pickle_pkl]: https://www.datalearner.com/blog/1051552293835179
还没有评论,来说两句吧...