Python基础编程——标准库之shelve模块
在实际开发中,要将数据进行持久化,通常的做法是,将数据保存到文件或者数据库中。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程序中实际发生了如下事情:
- 列表['北京', '上海', '广州']被存储到了shelve_object的'name'键下。
- 获取存储的表示,并用其创建了一个新的列表,然后将'深圳'添加到这个列表的末尾,但是这个修改后的版本并未被存储。
- 最后,再次获取时,仍然获取到的是原来的版本 — 这其中当然就没有'深圳'了。
要解决前面遇到的问题,有两种方法,具体如下所示:
- 方法一:将获取到的副本赋值给一个临时变量,修改临时变量后,再将这个临时变量的值赋值给副本,最后进行存储。
- 方式二:打开文件时,将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'] = ['北京', '上海', '广州', '深圳']
总结
本节主要介绍了以下内容:
- 使用shelve模块将数据存储到文件中。
- 需要注意的是修改数据时避免“小陷阱”。
下一节将会介绍re模块,敬请关注!
如果有需要文中小程序的可以私信我哟!
创作不容易,还请点个赞!喜欢的小伙伴请点关注、收藏!
欢迎大家转发、评论!