Python基础编程——标准库之shelve模块

liftword1周前 (04-30)技术文章1

在实际开发中,要将数据进行持久化,通常的做法是,将数据保存到文件或者数据库中。Python有多种方法将数据保存到文件中,本节将会介绍使用Python的标准库shelve来将数据保存到文件中。

shelve模块

在shelve模块中,使用open()函数来打开一个文件,需要注意的是,这个open()函数返回的不是一个文件对象,而是一个shelve对象。我们可以使用这个对象来存储数据,并且可以像操作普通字典一样操作这个对象,当操作完成后,可以像文件对象那样进行关闭。具体如下my_shelve.py程序所示:

# my_shelve.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import shelve

shelve_object = shelve.open('my_shelve.dat')
shelve_object['name'] = 'Python编程爱好者'
print(shelve_object['name'])
shelve_object.close()

程序执行结果如下所示:
Python编程爱好者

在程序my_shelve.py程序所在的目录下可以看到生成了如下的文件:


在这里会有一个小的陷阱,当键所对应的元素是一个可变对象,直接修改可变对象后,得到的结果可能不是我们想要的结果,我们修改前年的my_shelve.py,具体如下所示:

# my_shelve.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import shelve

shelve_object = shelve.open('my_shelve.dat')
shelve_object['name'] = 'Python编程爱好者'
print(shelve_object['name'])

shelve_object['name'] = 'Python基础教程'
print(shelve_object['name'])

# 一个小的陷阱
shelve_object['name'] = ['北京', '上海', '广州']
print(shelve_object['name'])  # 此时shelve_object['name']的值应该是['北京', '上海', '广州']
# 修改键name所对应的元素值,添加深圳
shelve_object['name'].append('深圳')
print(shelve_object['name'])    # 我们想要的结果应该是['北京', '上海', '广州', '深圳'],但却只得到了['北京', '上海', '广州']

shelve_object.close()

程序执行结果如下所示:
Python编程爱好者
Python基础教程
['北京', '上海', '广州']
['北京', '上海', '广州']

上面的程序并没有得到我们想要的结果,'深圳'去哪儿了?其实这很好理解,当查看shelve对象中的元素时,将会使用存储在文件中的版本来重建该对象,当给键赋值值,会将元素进行存储。在上面的my_shelve.py程序中实际发生了如下事情:

  1. 列表['北京', '上海', '广州']被存储到了shelve_object的'name'键下。
  2. 获取存储的表示,并用其创建了一个新的列表,然后将'深圳'添加到这个列表的末尾,但是这个修改后的版本并未被存储
  3. 最后,再次获取时,仍然获取到的是原来的版本 — 这其中当然就没有'深圳'了。

要解决前面遇到的问题,有两种方法,具体如下所示:

  1. 方法一:将获取到的副本赋值给一个临时变量,修改临时变量后,再将这个临时变量的值赋值给副本,最后进行存储。
  2. 方式二:打开文件时,将open()函数的writeback参数为True。这样,从shelve对象中读取或者赋值给它的所有数据结构都将被保存到内存中直到关闭shelve对象时将数据写入磁盘中。

再次修改前面的my_shelve.py程序,验证前面的两种方法能够解决那个小陷阱,具体如下my_shelve.py程序所示:

# my_shelve.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# 方法一
shelve_object = shelve.open('my_shelve.dat')
shelve_object['name'] = ['北京', '上海', '广州']
print("shelve_object['name'] = {}".format(shelve_object['name']))
temp = shelve_object['name']
temp.append('深圳')
shelve_object['name'] = temp
print("shelve_object['name'] = {}".format(shelve_object['name']))
shelve_object.close()

del shelve_object

# 方法二
shelve_object = shelve.open('my_shelve.dat', writeback=True)
shelve_object['name'] = ['北京', '上海', '广州']
print("shelve_object['name'] = {}".format(shelve_object['name']))
shelve_object['name'].append('深圳')
print("shelve_object['name'] = {}".format(shelve_object['name']))

shelve_object.close()

程序执行结果如下所示:
shelve_object['name'] = ['北京', '上海', '广州']
shelve_object['name'] = ['北京', '上海', '广州', '深圳']
shelve_object['name'] = ['北京', '上海', '广州']
shelve_object['name'] = ['北京', '上海', '广州', '深圳']

总结

本节主要介绍了以下内容:

  1. 使用shelve模块将数据存储到文件中。
  2. 需要注意的是修改数据时避免“小陷阱”。

下一节将会介绍re模块,敬请关注!

如果有需要文中小程序的可以私信我哟!

创作不容易,还请点个赞!喜欢的小伙伴请点关注、收藏!

欢迎大家转发、评论!

#python##Python##Python基础##python打卡#

相关文章

python进阶实战:如何使用自定义模块(包)?

有时,我们希望在py文件中导入其他py文件中的函数或类等功能,这样就可以将自己编写的代码进行重复使用,并且可以规范化积累自己的代码,成为自己代码学习的重要成果。当然,可以将这些模块化的代码共享出来,供...

必知必会!Python json模块全解析(python jsonpath-rw)

深入掌握Python json模块:从基础到实战的全面指南在当今数据驱动的时代,高效的数据处理与交换至关重要。JSON(JavaScript Object Notation)作为一种轻量级的数据交换格...

9-Python自定义函数(python自定义一个函数)

1-概念在Python中,自定义函数是指由用户根据自身需求定义的函数。通过定义自己的函数,可以将代码组织成可重用的模块,提高代码的可读性和维护性。此外,函数还可以接受参数并返回结果,使得程序逻辑更加清...

python进阶突破内置模块——数据序列化与格式

数据序列化是将数据结构或对象转换为可存储/传输格式的过程,反序列化则是逆向操作。Python 提供了多种工具来处理不同场景下的序列化需求。一、核心内置模块1.json模块最常用的轻量级数据交换格式,适...

Python其实很简单 第十四章 模块(python入门之模块第二关)

模块是一组程序代码,可以是别人已经写好的,也可以是自己编写的,但都是已经存在的,在编程时直接使用就可以了。模块机制的最大好处就是程序员不再编写重复的代码,而直接利用已有的成果,这样就能将更多的精力投入...

Python import自定义模块报错、自定义异常、字符串处理、截取

一、python import自定义的模块报错问题现象:pycharm中运行一切正常,但是到命令行中(cmd命令行或pycharm的Terminal窗口)运行py文件,就会报错No module na...