Python 腌制


Python pickle 模块用于序列化和反序列化 Python 对象结构。将任何类型的 Python 对象(列表、字典等)转换为字节流(0 和 1)的过程称为腌制或序列化或扁平化或编组。我们可以通过称为反腌制的过程将字节流(通过腌制生成)转换回 Python 对象。

为什么要使用 Pickle?在现实世界中,腌制和反腌制的用途非常广泛,因为它们允许我们轻松地将数据从一个服务器/系统传输到另一个服务器/系统,然后将其存储在文件或数据库中。

注意事项:建议不要反腌制来自不受信任来源的数据,因为它们可能构成安全威胁。但是,pickle 模块无法在腌制恶意数据时识别或发出警报。

只有在导入 pickle 模块后,我们才能进行腌制和反腌制。可以使用以下命令导入 pickle:

import pickle

Pickle 示例

下面是一个关于如何腌制列表的简单程序

腌制一个简单的列表:Pickle_list1.py

import pickle
mylist = ['a', 'b', 'c', 'd']
with open('datafile.txt', 'wb') as fh:
   pickle.dump(mylist, fh)

在上面的代码中,列表“mylist”包含四个元素('a'、'b'、'c'、'd')。我们以“wb”模式而不是“w”模式打开文件,因为所有操作都在当前工作目录中使用字节进行。创建了一个名为“datafile.txt”的新文件,它将 mylist 数据转换为字节流。

反腌制一个简单的列表:unpickle_list1.py

import pickle
pickle_off = open ("datafile.txt", "rb")
emp = pickle.load(pickle_off)
print(emp)

输出:运行以上脚本后,您可以再次看到 mylist 数据作为输出。

['a', 'b', 'c', 'd']

腌制一个简单的字典 -

import pickle
EmpID = {1:"Zack",2:"53050",3:"IT",4:"38",5:"Flipkart"}
pickling_on = open("EmpID.pickle","wb")
pickle.dump(EmpID, pickling_on)
pickling_on.close()

反腌制一个字典 -

import pickle
pickle_off = open("EmpID.pickle", 'rb')
EmpID = pickle.load(pickle_off)
print(EmpID)

运行以上脚本(反腌制)后,我们获得了我们之前初始化的字典。另外,请注意,因为我们在这里读取字节,所以我们使用了“rb”而不是“r”。

输出

{1: 'Zack', 2: '53050', 3: 'IT', 4: '38', 5: 'Flipkart'}

Pickle 异常

以下是处理 pickle 模块时引发的一些常见异常 -

  • Pickle.PicklingError:如果 pickle 对象不支持腌制,则会引发此异常。

  • Pickle.UnpicklingError:如果文件包含错误或损坏的数据。

  • EOFError:如果检测到文件结尾,则会引发此异常。

优点

  • 方便保存复杂数据。

  • 易于使用,更轻量级,不需要多行代码。

  • 生成的腌制文件不容易阅读,因此提供了一定的安全性。

缺点

  • 除了 Python 之外的其他语言可能无法重建腌制的 Python 对象。

  • 存在反腌制来自恶意来源数据的风险。

更新于: 2019-07-30

15K+ 浏览量

开启您的 职业生涯

通过完成课程获得认证

立即开始
广告