Python酸洗

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对象。

  • 从恶意源中窃取数据的风险。