Python Shelve模块
我们在日常生活中经常遇到许多情况,需要使用数据库管理系统来存储所有所需的信息和数据。使用数据库管理系统通常很简单,但有时在存储一些复杂的结构化数据时会变得有些困难。数据库管理系统有各种类型,但我们通常在日常生活中使用的最常见类型是关系型数据库管理系统(RDBMS)。RDBMS是一种有效的工具和管理系统,我们可以在其中存储所有所需的信息和数据,并且非常容易地进行管理。当我们不需要使用关系型数据库管理系统,或者无法使用RDBMS存储数据时,有许多情况会出现这种情况。在这种情况下,会有一些问题出现在我们的脑海中:在这种情况下是否有其他替代方案,有没有其他存储数据的方法或工具等等。
这些问题的答案是肯定的!我们有其他工具和方法,可以在不使用RDBMS方法时存储数据。我们有其他工具,其中许多工具与编程语言的库相关联。这意味着,在编程世界中,存在可以在无法使用关系型数据库管理系统的情况下使用的提供有效工具的库。这也适用于Python,我们可以通过在Python中创建类似数据库管理系统的接口的库来存储所有重要的数据。Python中的一个这样的库或模块是Shelve模块,它是一种用于存储或持久存储数据的有效工具。在本教程中,我们将学习有关Python的Shelve模块,在Python程序中使用Shelve模块存储数据。
Python中的Shelve模块
Python的Shelve模块是Python的一个非常流行的模块,它可以像使用Python程序将数据持久存储在文件中的有效工具一样工作。正如这个模块的名称Shelve所示,我们可以很容易地解释它将作为一个架子对象来保存我们所有的数据并保存所有必要的信息。在Shelve模块中,定义了一个架子对象,它的行为类似于一个字典类型对象,并且它在我们计算机的磁盘文件中被持久地存储。这就是我们可以通过Python的Shelve模块保存系统中的所有数据和信息,并在我们想要的任何时候保留它的方式。
Shelve模块:简介
Python的Shelve模块是一个有效的工具,通过它我们可以将所有数据和信息存储在文件中,并将其保存在计算机的存储器中,直到我们改变主意将其删除为止。Shelve模块不仅有助于将信息存储在文件中,而且在相同的文件中修改已经存在的信息并添加一些新的信息也非常有效。我们可以通过在Python程序中使用这个模块和它的函数来执行所有这些操作(从文件创建、读取、写入和删除)。Shelve模块创建了一个非常类似于UNIX等系统上存在的DBMS数据库的文件。我们只能在文件中的特殊字典对象中使用字符串数据类型作为键,而来自shelve文件的可拾取对象可以作为键的值。
Shelve模块:类
像Python的任何其他模块一样,Shelve模块中也有一些类,并且我们将在本节中讨论这些类。在Python的Shelve模块中定义了以下三个类:
S. No. | 模块类 | 描述 |
---|---|---|
1 | Shelf 类 | Shelf 类是Shelve模块的基类,用于在shelve文件中实现shelf。我们可以使用Python程序内的类字典对象初始化Shelve模块的Shelf类。 |
2 | DBFileNameShelf 类 | 这是基本Shelf类的子类,并且它接受shelve文件名作为其构造函数的参数,而不是类字典对象参数。 |
3 | BsdDbShelf 类 | BsdDbShelf 类也是基本shelf类的子类,此类接受类字典对象作为参数,这使得此子类与DBFileNameShelf类不同。我们传递给其构造函数的类字典对象参数应支持first()、last()、previous()、next()和set_location()方法。 |
现在,我们在Shelve模块中描述了所有的类和子类,并且我们也学习了在这些类中哪种对象类型被作为参数使用。
使用Shelve模块
Shelve模块是Python的内置库,可以在所有版本的Python 2和3中预安装此模块。因此,要使用Shelve模块,我们不需要首先使用任何安装程序或pip命令来安装Shelve模块。我们可以在Python程序中直接使用’import shelve’语句来导入并使用Shelve模块的所有函数。为了理解Shelve模块的工作原理,我们将把其实现部分分为三个部分,首先我们创建一个shelf文件并在其中存储数据,其次,我们打开文件并从中检索值,最后,我们更新shelf文件中的数据。我们将通过以下三个步骤学习Shelve模块的工作和实现:
- 创建一个shelf文件来存储数据
- 从shelf文件中检索数据
- 更新shelf文件中的数据
我们将通过使用一个示例程序来学习上述三个部分中的每个部分,其中我们使用Shelve模块的函数来执行相应的任务。现在,让我们通过首先创建一个示例Shelve文件来学习Shelve模块工作的每个部分的实现。
创建一个用于存储数据的Shelve文件:
如果我们想在shelf文件中存储一些数据,首先我们必须创建一个shelf文件,然后才能添加期望的数据。我们可以通过简单地使用其 open() 函数来创建一个shelf文件,该函数的工作方式类似于我们在文件处理过程中使用的open()函数。使用Shelve模块的 open() 函数,我们必须遵循下面给出的语法来打开或创建一个新的shelf文件:
>> shelve = open(NameOfFile, flag = 'c', protocol = None, writeback = True)
它将从DbfilenameShelf子类中返回一个shelf对象,其中对象将收集用户输入的数据以存储在文件中。下面是上述open()函数语法中使用的参数的描述:
- NameOfFile: 它是我们希望将文件命名为的文件名(将用于创建/打开的数据库(shelf文件))。
- 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文件并在其中存储了数据:
# Importing the Shelve Module
import shelve
# Creating a shelve file with open() function
shelveVariable = shelve.open("SampleFile")
print("A Shelve file with SampleFile name is successfully created")
# Making entries inside the shelve file
shelveVariable['Employee Name'] = 'Jackie Chan'
shelveVariable['Employee Age'] = 27
shelveVariable['Employee department'] = Management
shelveVariable['Employee Performance'] = Excellent
shelveVariable['Employee Score'] = 9.2
shelveVariable.close()
print("All entries are successfully made inside the sample shelve file")
输出:
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模块中各种类型的方法:
序号 | 方法名称 | 方法描述 |
---|---|---|
1 | get() | 此方法将返回数据库文件中与给定键(作为方法内参数提供)相关联的值。 |
2 | keys() | keys()方法用于返回shelve文件(文件名作为方法参数提供)中所有键的名称。 |
3 | values() | values()方法与shelve模块的keys()方法非常相似,它返回shelve文件中的值。 |
4 | items() | 如果我们想在单个调用中从shelve文件中获得键和值,可以使用items()方法,方法参数为shelve文件的名称。 |
5 | close() | close()方法首先同步我们为shelve文件提供的项目,然后关闭我们在打开/创建shelve文件时初始化的持久字典对象。 |
6 | update() | 如果我们想更新shelve文件并添加更多条目,可以使用update()方法。 |
7 | pop() | pop()方法与update()方法完全相反,它用于从shelve文件中删除条目(键和值与之对应)。 |
8 | sync() | sync()方法用于在打开shelve文件时将writeback设置为True时,将所有条目写回程序的缓存内存中。 |
我们可以使用shelve模块的所有方法对我们创建的数据库shelve文件执行各种功能,并且我们将在稍后的示例中使用其中的一些方法。
从Shelve文件中检索数据
在创建shelve文件并将数据条目写入该文件后,我们首先想做的是检查所有条目是否成功写入文件中。检查的最佳方法是将所有条目打印出来,看看是否打印了所有条目。当我们不知道shelve文件中存在什么数据时(其他人处理过我们的shelve文件或者我们正在处理其他人的shelve文件的情况下),这种方法也非常有用。我们可以通过诸如get()、values()、items()和keys()之类的方法来访问Shelve中的数据。所有这些方法的工作方式都非常不同,返回的数据形式也不同,因此我们将使用每个方法从我们在示例1中创建的示例shelve文件中返回数据。
(i) 通过get()方法获取单个值:
我们可以通过在get()方法中提供一个键直接打印特定键的值,并且为了理解这个方法,我们将在一个示例程序中使用它。
示例2:
# Importing the Shelve Module
import shelve
# Opening the sample shelve file with open() function
shelveVariable = shelve.open("SampleFile")
# Print data entries from the sample shelve file in the output
print("Name of Employee in the file: ", shelveVariable['Employee Name'])
print("Age of Employee: ", shelveVariable['Employee Age'])
print("Department of Employee: ", shelveVariable['Employee department'])
print("Score of Employee: ", shelveVariable['Employee Score'])
输出:
Name of Employee in the file: Jackie Chan
Age of Employee: 27
Department of Employee: Management
Score of Employee: 9.2
正如我们所看到的,在 get() 方法中给定相应密钥的数据值被打印在输出中。
(ii) 一次从shelf文件中获取所有项目:
如果我们想一次性从shelf文件中检索所有项目,我们可以使用 items() 方法与shelf对象,它将返回输出中样本shelf文件中的所有项目。我们将使用以下示例程序来理解此方法的实现:
示例3:
# Importing the Shelve Module
import shelve
# Opening the sample shelve file with open() function
shelveVariable = shelve.open("SampleFile")
# Print all data entries from the sample shelve file in list form
print("Items in the sample shelve file: ", list(shelveVariable.items()))
输出:
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:
# Importing the Shelve Module
import shelve
# Opening the sample shelve file with open() function
shelveVariable = shelve.open("SampleFile")
# Print only keys from the sample shelve file in the output
print("Keys in the sample shelve file: ", list(shelveVariable.keys()))
输出:
Keys in the sample shelve file: ['Employee Name', 'Employee Age', 'Employee department', 'Employee Performance', 'Employee Score']
在输出中打印样本shelve文件中的所有键,使用 keys() 方法。
(iv) 仅从shelve文件中检索值:
这个方法及其实现与我们使用keys()函数的上一个方法完全相同,但这里我们必须使用values()函数来打印shelve文件中的所有值。
示例5:
# Importing the Shelve Module
import shelve
# Opening the sample shelve file with open() function
shelveVariable = shelve.open("SampleFile")
# Print only values from the sample shelve file in the output
print("Values in the sample shelve file: ", list(shelveVariable.values()))
输出:
Values in the sample shelve file: ['Jackie Chan', 27, 'Management', 'Excellent', 9.2]
在输出中打印了样本shelve文件中的所有值,使用 keys() 方法。
更新Shelve文件中的数据
我们甚至可以更新shelve文件中已经存在的数据,在这种方法中,我们可以执行三个任务,但是在这里我们只执行两个任务。首先,我们可以更新文件中已经存在的键的值;其次,我们可以添加新条目;最后,我们可以从文件中删除条目。如果我们想将与键相关联的当前值更新为新值,我们必须使用键对象写入新值,程序将在该键中分配新值。
(i) 在shelve文件中添加新条目:
如果我们想添加新条目,我们首先必须在程序中定义一个字典变量,然后我们可以用键值对将新条目写入其中。之后,我们可以使用 update() 方法,将字典变量的名称作为参数提供给该方法,它将在文件中添加新条目。
示例6:
# Importing the Shelve Module
import shelve
# Opening the sample shelve file with open() function
shelveVariable = shelve.open("SampleFile")
# Adding new fields inside the sample shelve file
sampleDict = {'Employee Salary' : 50000, 'Employee Sub-department' : 'Field Work'}
shelveVariable.update(sampleDict)
# Print data entries from the sample shelve file in list form
print("Items in the sample shelve file: ", list(shelveVariable.items()))
输出:
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')]
正如我们所看到的,当我们打印样本存储文件中的所有项目时,也包括了新的项目,这意味着文件中进行了新的条目添加。
(ii) 从存储文件中删除条目:
如果我们想要删除文件中存在的条目,我们可以使用 pop() 方法。我们必须在函数中写入关键字名称,它将从存储文件中删除与该关键字和关联值相关的内容。我们可以通过打印存储文件中的所有项目来验证这一点。
示例7:
# Importing the Shelve Module
import shelve
# Opening the sample shelve file with open() function
shelveVariable = shelve.open("SampleFile")
# Delete a field from the shelve file
shelveVariable.pop('Employee Performance')
# Print data entries from the sample shelve file in list form
print("Items in the sample shelve file: ", list(shelveVariable.items()))
输出:
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() 方法移除。