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 模块批量加载数据,或进行数据格式转换操作。

本文章首发在 LearnKu.com 网站上。
上一篇 下一篇
贡献者:1
讨论数量: 0
发起讨论 只看当前版本


暂无话题~