Python pickle模块用于对python对象结构进行序列化和反序列化。将任何种类的python对象(列表,字典等)转换为字节流(0和1)的过程称为酸洗或序列化或展平或编组。我们可以通过称为解酸的过程将字节流(通过酸洗生成)转换回python对象。
为什么要腌制?:在现实世界中,腌制和解腌的使用非常普遍,因为它们使我们能够轻松地将数据从一个服务器/系统传输到另一个服务器/系统,然后将其存储在文件或数据库中。
注意事项:建议不要释放从不可信来源收到的数据,因为它们可能构成安全威胁。但是,泡菜模块在腌制恶意数据时无法知道或发出警报。
只有导入了pickle模块后,我们才能进行酸洗和解酸。导入泡菜可以使用以下命令完成-
import 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)
在上面的脚本(unpickle)上运行时,我们会返回我们先前初始化的字典。另外,请注意,因为我们在这里读取字节,所以我们使用“ rb”而不是“ r”。
输出结果
{1: 'Zack', 2: '53050', 3: 'IT', 4: '38', 5: 'Flipkart'}
以下是在处理pickle模块时引发的一些常见异常-
Pickle.PicklingError:如果pickle对象不支持酸洗,则会引发此异常。
Pickle.UnpicklingError:如果文件包含错误或损坏的数据。
EOFError:如果检测到文件结尾,则会引发此异常。
优点:
方便保存复杂数据。
易于使用,更轻便,不需要几行代码。
生成的腌制文件不容易阅读,因此提供了一定的安全性。
缺点:
python以外的其他语言可能无法重建腌制的python对象。
从恶意源中窃取数据的风险。