- Python 数据持久化教程
- Python 数据持久化 - 首页
- Python 数据持久化 - 简介
- Python 数据持久化 - 文件 API
- 使用 os 模块处理文件
- Python 数据持久化 - 对象序列化
- Python 数据持久化 - Pickle 模块
- Python 数据持久化 - Marshal 模块
- Python 数据持久化 - Shelve 模块
- Python 数据持久化 - dbm 包
- Python 数据持久化 - CSV 模块
- Python 数据持久化 - JSON 模块
- Python 数据持久化 - XML 解析器
- Python 数据持久化 - Plistlib 模块
- Python 数据持久化 - Sqlite3 模块
- Python 数据持久化 - SQLAlchemy
- Python 数据持久化 - PyMongo 模块
- Python 数据持久化 - Cassandra 驱动程序
- 数据持久化 - ZODB
- 数据持久化 - Openpyxl 模块
- Python 数据持久化资源
- Python 数据持久化 - 快速指南
- Python 数据持久化 - 有用资源
- Python 数据持久化 - 讨论
Python 数据持久化 - Pickle 模块
Python 中序列化和反序列化的术语分别为 pickling 和 unpickling。Python 库中的 pickle 模块使用非常 Python 特定的数据格式。因此,非 Python 应用程序可能无法正确地反序列化 pickled 数据。建议不要从未经身份验证的来源反序列化数据。
序列化(pickled)的数据可以存储在字节字符串或二进制文件中。此模块定义了 **dumps()** 和 **loads()** 函数,用于使用字节字符串对数据进行 pickle 和 unpickle 操作。对于基于文件的过程,该模块具有 **dump()** 和 **load()** 函数。
Python 的 pickle 协议是在将 Python 对象构造和解构为/从二进制数据时使用的约定。目前,pickle 模块定义了 5 种不同的协议,如下所示:
序号 | 名称和描述 |
---|---|
1 |
协议版本 0 原始的“人类可读”协议,与早期版本兼容。 |
2 |
协议版本 1 旧的二进制格式,也与早期版本的 Python 兼容。 |
3 |
协议版本 2 在 Python 2.3 中引入,提供了对新式类的有效 pickling。 |
4 |
协议版本 3 在 Python 3.0 中添加。当需要与其他 Python 3 版本兼容时推荐使用。 |
5 |
协议版本 4 在 Python 3.4 中添加。它增加了对超大对象的支持。 |
示例
pickle 模块包含 dumps() 函数,该函数返回 pickled 数据的字符串表示形式。
from pickle import dump dct={"name":"Ravi", "age":23, "Gender":"M","marks":75} dctstring=dumps(dct) print (dctstring)
输出
b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x04\x00\x00\x00Raviq\x02X\x03\x00\x00\x00ageq\x03K\x17X\x06\x00\x00\x00Genderq\x04X\x01\x00\x00\x00Mq\x05X\x05\x00\x00\x00marksq\x06KKu.
示例
使用 loads() 函数,对字符串进行 unpickle 并获取原始字典对象。
from pickle import load dct=loads(dctstring) print (dct)
输出
{'name': 'Ravi', 'age': 23, 'Gender': 'M', 'marks': 75}
pickled 对象也可以使用 dump() 函数持久地存储在磁盘文件中,并使用 load() 函数检索。
import pickle f=open("data.txt","wb") dct={"name":"Ravi", "age":23, "Gender":"M","marks":75} pickle.dump(dct,f) f.close() #to read import pickle f=open("data.txt","rb") d=pickle.load(f) print (d) f.close()
pickle 模块还提供面向对象的 API,用于以 **Pickler** 和 **Unpickler** 类的形式实现序列化机制。
如上所述,就像 Python 中的内置对象一样,用户定义类的对象也可以持久地序列化到磁盘文件中。在下面的程序中,我们定义了一个 User 类,其实例属性为姓名和手机号码。除了 __init__() 构造函数外,该类还覆盖了 __str__() 方法,该方法返回其对象的字符串表示形式。
class User: def __init__(self,name, mob): self.name=name self.mobile=mob def __str__(self): return ('Name: {} mobile: {} '. format(self.name, self.mobile))
为了将上述类的对象 pickle 到文件中,我们使用 pickler 类及其 dump() 方法。
from pickle import Pickler user1=User('Rajani', '[email protected]', '1234567890') file=open('userdata','wb') Pickler(file).dump(user1) Pickler(file).dump(user2) file.close()
相反,Unpickler 类具有 load() 方法来检索序列化的对象,如下所示:
from pickle import Unpickler file=open('usersdata','rb') user1=Unpickler(file).load() print (user1)