8.1. 数据持久化和数据交换
保存数据以供长期使用有两个方面:在内存和存储格式间来回转换数据,以及处理转换后的数据存储。标准库有各种模块可以在不同的情形处理这两方面。
有两个模块可以转换对象为传输或存储的格式(称为序列化)。持久化方面最常见的是 pickle
,因为它与其它实际存储序列化数据的标准库模块集成,比如 shelve
。而 json
更常用于 web 应用,因为它与现有的 web 服务存储工具集成得更好。
将内存对象转换成可以保存的格式后,下一步就是如何存储数据。一个简单的文件可以存放顺序写入的序列化对象,它们不需要任何索引。Python 有一系列模块,可以在需要索引查找时以 DBM 形式在简单数据库中存储键值对。
利用 DBM 格式最直接的方法是 shelve
。打开 shelve 文件,通过类似字典的 API 访问。保存到数据库中的对象将自动被挑选和保存,不需要调用方其它额外的工作。
shelve
有一个缺点,在使用默认接口时,无法预测哪种 DBM 格式将被使用,因为它会根据创建数据库的系统上可用的依赖库来选择。如果应用不需要在具有不同依赖库的主机之间共享数据库文件,这个格式就不重要,但如果需要可移植性,请使用模块中的类来确保选择特定的格式。
对于已经通过 JSON 使用数据的 web 应用,json
和 dbm
提供了另一种持久化机制。直接使用 dbm
比 shelve
需要多一点工作,因为 DBM 数据库中键和值必须是字符串,并且值在访问时不会自动重新创建。
大多数发行版都带有进程中的关系数据库 sqlite3
用于存储比键值对更复杂的数据,其数据库存储在内存或本地文件中,所有访问都来自同一进程,因而没有网络通信延迟。sqlite3
的紧凑特性使得它特别适合在桌面应用或 web 应用开发中使用。
为了同使用其他语言编写的应用程序进行数据交换,Python 还提供了一些用于解析更为「正式」的数据格式的模块。 xml.etree.ElementTree
可以解析 XML 文档,并为不同应用程序提供多种操作方式。除此之外, ElementTree
还可以将内存中的对象序列化为 XML 文档,并进行格式化输出。 csv
可以对逗号分隔值( Comma Separated Value , CSV )文件进行读写。这种文件内容大多为表格数据,一般由电子表格或数据库程序生成。我们可以使用 csv
模块批量加载数据,或进行数据格式转换操作。
- pickle — 对象序列华
- shelve — 实例对象的持久化
- dbm — Unix 键值数据库
- sqlite3 — 嵌入式关系型数据库
- xml.etree.ElementTree — XML 操作接口
- csv — 「逗号分隔值」文件
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。