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 对象。
存在反腌制来自恶意来源数据的风险。