Python Shelve 模块

2024年8月29日 | 13分钟阅读

在我们的日常生活中,我们都遇到过许多需要使用数据库管理系统来存储所有所需信息和数据的情况。使用数据库管理系统通常非常简单,但有时当我们必须存储一些复杂的结构化数据时,就会变得有点困难。数据库管理系统有各种类型,但我们日常生活中最常用的是关系型数据库管理系统 (RDBMS)。RDBMS 是一个有效的工具和管理系统,我们可以轻松地存储和管理所有必要的信息和数据。在许多情况下,我们不必使用关系型数据库管理系统,或者无法使用 RDBMS 来存储数据。在这种情况下,我们心中会产生一些问题:在这种情况下是否有其他替代方案,是否有其他方法或工具来存储数据等等。

这些问题的答案是肯定的!当不必使用 RDBMS 方法时,我们有其他工具和方法可以存储数据。我们有其他工具,其中许多工具都与编程语言的库相关联。这意味着,在编程世界中,当使用关系型数据库管理系统不是一个选项时,有些库提供了有效的工具可以使用。这同样适用于 Python,在 Python 中我们有库,通过这些库我们可以通过创建类似 DBMS 的接口来存储所有重要数据。Python 中这样的库或模块之一是 Shelve 模块,它是存储或持久数据存储的有效工具。在本教程中,我们将学习 Python 的 Shelve 模块,在该模块中,我们使用 Shelve 模块在 Python 程序中存储数据。

Python 中的 Shelve 模块

Python 的 Shelve 模块是一个非常流行的 Python 模块,它通过 Python 程序在文件中进行持久数据存储方面发挥着有效的作用。正如这个模块的名称所示,即 Shelve(书架),我们可以很容易地理解它将作为一个书架对象来保存我们所有的文件中的数据并保存所有必要的信息。在 Shelve 模块中,定义了一个书架对象,它像字典类型的对象一样工作,并持久地存储在我们计算机的磁盘文件中。这就是我们如何通过 Python Shelve 模块在我们的系统中保存所有数据和信息,并根据需要保留它们。

Shelve 模块:简介

Python 的 Shelve 模块是一个有效的工具,通过它我们可以将所有数据和信息存储在一个文件中,并将其保存在我们计算机的存储中,直到我们改变主意将其删除。Shelve 模块不仅有助于将信息存储在文件中,而且在修改现有信息和在同一文件中添加新信息方面也非常有效。我们可以通过在 Python 程序中使用此模块及其功能来执行 Shelve 模块的所有这些操作(创建、读取、写入和从文件中删除)。Shelve 模块创建的文件与 UNIX 等系统上存在的 DBMS 数据库非常相似。我们只能使用字符串数据类型作为文件中特殊字典对象中的键,而 shelve 文件中可序列化的对象可以作为键的值。

Shelve 模块:类

与任何其他 Python 模块一样,Python 的 Shelve 模块中也存在一些类,我们将在本节中讨论这些类。Python Shelve 模块中定义了以下三个类

序号。模块类描述
1Shelf 类Shelf 类是 Shelve 模块的基础类,它用于 shelve 文件中的 shelve 实现。我们可以在 Python 程序中,使用类似字典的对象初始化 Shelve 模块中的 Shelf 类。
2DBFileNameShelf 类这是基础 Shelf 类的子类,它接受 shelve 文件的名称作为其构造函数的参数,而不是类似字典的对象参数。
3BsdDbShelf 类BsdDbShelf 类也是基础 Shelf 类的子类,此BsdDbShelf类接受类似字典的对象作为参数,这使得此子类与DBFileNameShelf类不同。我们作为参数传递给其构造函数的类似字典的对象参数应支持 first()、last()、previous()、next() 和 set_location() 方法。

现在,我们已经描述了 Shelve 模块中存在的所有类和子类,并且我们还学习了这些类中将哪种对象类型作为参数。

使用 Shelve 模块

Shelve 模块是 Python 的内置库,在 Python 2 和 3 的所有版本中都可以找到这个预装模块。因此,要使用 Shelve 模块,我们不必先使用任何安装程序或 pip 命令来安装 Shelve 模块。我们可以在 Python 程序中直接使用 'import shelve' 语句来导入和使用该程序中 Shelve 模块的所有函数。为了理解 Shelve 模块的工作原理,我们将其实现部分分为三部分,首先我们创建一个 shelve 文件并向其中存储数据,其次,我们打开文件并从中检索值,最后,我们更新 shelve 文件中的数据。我们将通过以下三个步骤学习 Shelve 模块的工作原理和实现

  • 创建 shelve 文件以存储数据
  • 从 Shelve 文件中检索数据
  • 更新 Shelve 文件中的数据

我们将通过一个示例程序学习上面提到的每个部分,在该程序中,我们使用 Shelve 模块的功能执行相应的任务。现在,让我们通过首先创建一个示例 Shelve 文件来学习 Shelve 模块每个部分的工作原理和实现。

创建 Shelve 文件以存储数据

如果我们要将一些数据存储到 shelve 文件中,我们必须首先创建一个,然后才能添加所需的数据。我们可以通过简单地使用它的 open() 函数来创建一个 shelve 文件,它的工作原理与我们在文件处理过程中使用的 open() 函数类似。使用 Shelve 模块的 open() 函数,我们必须遵循以下语法来打开或创建一个新的 shelve 文件

它将从 DbfilenameShelf 子类返回一个 shelf 对象,该对象将收集用户数据以存储在文件中。以下是上面给出的 open() 函数语法中使用的参数的描述

  • NameOfFile: 这是我们想要分配或已经分配给通过 open() 创建/打开的数据库(shelve 文件)的文件名
  • flag: open() 函数语法中的 flag 参数是 c、w、n 和 r,其中 'c' 是默认值。flag 参数中的 'c' 关键字表示我们授予文件读写权限,'w' 表示我们授予只写权限,'r' 表示我们授予只读权限,'n' 表示我们正在创建名为 NameOfFile 的新文件。
  • Writeback: Writeback 参数默认值为 false,但如果我们将此参数设置为 true,则我们在 shelve 文件中输入的条目将被缓存到程序的缓存内存中。
  • Protocol: 函数中的 protocol 参数表示条目的 pickle 协议。

既然我们已经了解了 Shelve 模块 open() 函数的参数和语法,现在是时候在示例程序中使用此函数来理解其实现了。

示例 1

请看下面的 Python 程序,我们创建了一个 shelve 文件并将数据存储在该文件中

输出

A Shelve file with SampleFile name is successfully created
All entries are successfully made inside the sample shelve file

说明

我们首先在示例程序中导入了 Shelve 模块,以便我们可以使用它的 open() 函数来创建一个示例 shelve 文件。然后,我们在初始化的 shelveVariable 中使用了 open() 函数,以便进一步用于条目,并创建了一个名为“SampleFile”的示例 shelve 文件。然后,我们使用初始化的 shelveVariable 在我们创建的示例 shelve 文件中进行条目,并使用字典方法在其中进行多个条目。我们使用初始化的变量在单独的列中进行了多个条目,最后,我们使用了 close() 函数将这些条目保存到文件中。

当我们运行上面给出的示例程序时,将在我们的设备中创建一个名为“SampleFile.dir”的 shelve 文件,并在其中进行条目。

注意:每次我们访问系统中存在的 shelve 文件时,都会执行 sync() 和 close() 操作,这可能会减慢整个过程。

Shelve 模块中的方法

在上面的示例中,我们使用了 open() 方法来创建一个数据库 shelve 文件,但这并不是 shelve 模块中唯一的方法。Shelve 模块为我们提供了许多不同的方法,每种方法都有不同的功能,对我们非常有用。

shelve 模块中存在以下各种类型的方法

序号方法名称方法描述
1get()此方法将返回与数据库文件中存在的键(作为参数提供给方法)关联的值。
2keys()Keys() 方法用于返回 shelve 文件(我们在方法中将其名称作为参数提供)中存在的所有键的名称。
3values()values() 方法与 shelve 模块的 keys() 方法非常相似,因为它返回 shelve 文件中存在的值。
4items()如果我们要一次性从 shelve 文件中获取键和值,我们可以使用此 items() 方法,方法是将 shelve 文件的名称作为参数提供给该方法。
5close()close 方法首先同步我们为 shelve 文件提供的数据项,然后关闭我们在打开/创建 shelve 文件时初始化的持久字典对象。
6update()如果我们要更新我们的 shelve 文件并添加更多条目,我们可以使用 update() 方法来完成此操作。
7pop()pop() 方法与 update() 方法完全相反,因为它用于从 Shelve 文件中删除一个条目(键和值)。
8sync()当我们打开 shelve 文件时将 writeback 设置为 True 时,sync() 方法用于将所有条目回写入程序的缓存内存。

我们可以使用 shelve 模块的所有方法对我们创建的数据库 shelve 文件执行各种功能,我们将在后面的示例中使用其中一些方法。

从 Shelve 文件中检索数据

创建 shelve 文件并向其中输入数据后,我们要做的第一件事是检查所有条目是否成功输入到文件中。最好的检查方法是将所有这些条目打印到输出中,并查看所有条目是否都已打印。当我们不知道 shelve 文件中存在什么数据时(有人操作我们的 shelve 文件或我们正在操作别人的 shelve 文件),此方法也很有用。我们可以通过多种方法访问 Shelve 中的数据,例如 get()、values()、items() 和 keys()。所有这些方法的工作方式都非常不同,并以不同的形式返回相同的数据,因此我们将使用它们中的每一个来从示例 1 中创建的示例 shelve 文件中返回数据。

(i) 使用 get() 方法获取单个值

我们可以通过在 get() 方法中提供一个键来直接打印特定键的值,为了理解此方法,我们将在一个示例程序中使用它。

示例 2

输出

Name of Employee in the file:  Jackie Chan
Age of Employee:  27
Department of Employee:  Management
Score of Employee:  9.2

正如我们所看到的,在 get() 方法中给出的相应键的数据值被打印到输出中。

(ii) 一次性从 shelve 文件中获取所有项

如果我们要一次性从 shelve 文件中检索所有项,我们可以使用 shelve 对象的 items() 方法,它将把示例 shelve 文件中存在的所有项返回到输出中。我们将使用以下示例程序来理解此方法的实现

示例 3

输出

Items in the sample shelve file:  [('Employee Name', 'Jackie Chan'), ('Employee Age', 27), ('Employee department', 'Management'), ('Employee Performance', 'Excellent'), ('Employee Score', 9.2)]

正如我们在输出中看到的,当我们使用 items() 函数时,示例文件中存在的所有项都被打印了出来。

(iii) 从 shelve 文件中仅检索键

如果我们要打印示例 shelve 文件中仅存在的键,我们可以在打开 shelve 文件后在程序中使用 keys() 方法。

示例 4

输出

Keys in the sample shelve file:  ['Employee Name', 'Employee Age', 'Employee department', 'Employee Performance', 'Employee Score']

使用 keys() 方法,示例 shelve 文件中存在的所有键都会打印到输出中。

(iv) 从 shelve 文件中仅检索值

此方法及其实现与我们使用 keys() 函数的先前方法完全相同,但在这里我们必须使用 values() 函数来打印 shelve 文件中的所有值。

示例 5

输出

Values in the sample shelve file:  ['Jackie Chan', 27, 'Management', 'Excellent', 9.2]

使用 keys() 方法,示例 shelve 文件中存在的所有值都会打印到输出中。

更新 Shelve 文件中的数据

我们甚至可以更新 shelve 文件中已经存在的数据,在此方法中,我们可以执行三项任务,但在这里我们只执行两项。首先,我们可以更新文件中已经存在的键的值;其次,我们可以添加新条目;最后,我们可以从文件中删除一个条目。如果我们要将与键关联的当前值更新为新值,我们必须使用键对象写入新值,程序会将新值分配给该键。

(i) 在 shelve 文件中添加新条目

如果我们要添加新条目,我们首先必须在程序中定义一个字典变量,然后我们可以在其中以键值对的形式写入新条目。之后,我们可以使用 update() 方法,将字典变量的名称作为参数提供给该方法,它将在文件中添加新条目。

示例 6

输出

Items in the sample shelve file:  [('Employee Name', 'Jackie Chan'), ('Employee Age', 27), ('Employee department', 'Management'), ('Employee Performance', 'Excellent'), ('Employee Score', 9.2), ('Employee Salary', 50000), ('Employee Sub-department', 'Field Work')]

正如我们所看到的,当我们打印示例 shelve 文件中的所有项时,也出现了新项,这意味着文件中添加了新条目。

(ii) 从 shelve 文件中删除条目

如果我们要删除文件中已有的条目,我们可以使用 pop() 方法。我们必须在函数中写入键名,它将从 shelve 文件中删除该键及其关联的值。我们可以通过打印 shelve 文件中的所有项来验证这一点。

示例 7

输出

Items in the sample shelve file:  [('Employee Name', 'Jackie Chan'), ('Employee Age', 27), ('Employee department', 'Management'), ('Employee Score', 9.2), ('Employee Salary', 50000), ('Employee Sub-department', 'Field Work')]

正如我们所看到的,员工绩效键值条目在输出中不存在,因为我们通过 pop() 方法将其删除了。