day5-shelve模块

背景

          前面我们接触了Python中的json和pickle来对数据进行序列化,但在python3中只能dump一次load一次,可以dump n次,但是只能load 1次,因为先前的数据已经被后面dump的数据覆盖掉了。所以我们想要实现dump多次和load多次怎么办呢?—>这里引入了shelve模块,shelve模块可以持久化所有pickle所支持的数据类型。

概述

          shelve是一个简单的数据存储方案,类似key-value数据库,可以很方便的保存python对象,其内部是通过pickle协议来实现数据序列化。shelve只有一个open()函数,这个函数用于打开指定的文件(一个持久的字典),然后返回一个shelf对象。shelf是一种持久的、类似字典的对象。它与“dbm”的不同之处在于,其values值可以是任意基本Python对象--pickle模块可以处理的任何数据。这包括大多数类实例、递归数据类型和包含很多共享子对象的对象。keys还是普通的字符串。

定义

         利用shelve 模块,可以将Python 程序中的变量保存到二进制的shelf文件中。这样,程序就可以从硬盘中恢复变量的数据。shelve 模块让你在程序中添加“保存”和“打开”功能。例如,如果运行一个程序,并输入了一些配置设置,就可以将这些设置保存到一个shelf的文件,然后让程序下一次运行时加载它们。

1.持久化

import datetime
#导入shelve模块
import shelve     
#调用函数shelve.open()并传入一个文件名,然后将返回的值保存在一个变量中
f1=shelve.open("shelve_test")
#定义字典
info={"job":"it","age":29}
#定义列表
name=["maria","dick","jacky","sophie"]
f1["name"]=name  #持久化列表
f1["info"]=info  #持久化字典
f1["date"]=datetime.datetime.now() #持久化时间类型
f1.close()  

#执行后,不用dumps直接写入文件

解析:可以对这个变量的shelf 值进行修改,就像它是一个字典一样。当你完成时,在这个值上调用close()。这里,我们的shelf 值保存在f1中。我们创建了列表name,字典info,并写下f1['name'] =name,['info'] =info和时间类型['date'] =datetime.datetime.now(),将该列表,字典,时间类型保存在f1 中,作为键'name'、'info'、'date'关联的值(就像在字典中一样)。然后我们在f1上调用close()。

1.1在Windows 上运行前面的代码

你会看到在当前工作目录下有3 个新文件:shelve_test.bak、shelve_test.dat 和shelve_test.dir,我们查看其内容:

'name', (0, 56)
'date', (1024, 44)
'info', (512, 39)
shelve_test.bak
�]q (X   mariaqX   dickqX   jackyqX   sophieqe.                                                                                                                                                                                                                                                                                                                                                                                                                                                                        �}q (X   ageqKX   jobqX   itqu.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         �cdatetime
datetime
q C
�0Hq�qRq.
shelve_test.dat
'name', (0, 56)
'date', (1024, 44)
'info', (512, 39)
shelve_test.dir

1.2在OS X 上运行前面的代码

只会创建一个shelve_test.db 文件:

a�(�n}��������cdatetime
datetime
qC
�;(��q�qRq.date�}q(XageqKXjobqXitqu.info�����]q(XmariaqXdickqXjackyqXsophieqe.name����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
shelve_test.db

注:这些二进制文件包含了存储在shelf 中的数据。这些二进制文件的格式并不重要,你只需要知道shelve 模块做了什么,而不必知道它是怎么做的。该模块让你不用操心如何将程序的数据保存到文件中。

2.读取文件

程序稍后可以使用shelve 模块,重新打开这些文件并取出数据。shelf 值不必用读模式或写模式打开,因为它们在打开后,既能读又能写。在交互式环境中输入以下代码:

import datetime

import shelve

f1=shelve.open("shelve_test")
#使用get来读取数据
print(f1.get("name")) #读取列表
print(f1.get("info"))    #读取字典
print(f1.get("date"))   #读取函数
#输出
['maria', 'dick', 'jacky', 'sophie']
{'job': 'it', 'age': 29}
2017-07-13 23:35:03.980317

解析:这里,我们打开了shelf 文件,检查我们的数据是否正确存储。输入f1.get['name']将返回我们前面保存的同一个列表,所以我们就知道该列表得到了正确存储,然后我们调用close()。

就像字典一样,shelf 值有keys()和values()方法,返回shelf 中的类似列表的值。因为这些方法返回类似列表的值,而不是真正的列表,所以应该将它们传递给list()函数,取得列表的形式。在交互式环境中输入以下代码:

>>> f1=shelve.open("shelve_test")
>>> list(f1.keys())
['info', 'date', 'name']
>>> list(f1.values())
[{'job': 'it', 'age': 29}, datetime.datetime(2017, 8, 29, 21, 2, 54, 684772), ['maria', 'dick', 'jacky', 'sophie']]
>>> f1.close()

解析:创建文件时,如果你需要在Notepad 或TextEdit 这样的文本编辑器中读取它们,纯文本就非常有用。但是,如果想要保存Python 程序中的数据,那就使用shelve 模块。

基本用法

>>> import shelve
>>> f1 = shelve.open("shelve_test")
#常用方法
>>> dir(f1) 
['_MutableMapping__marker', '__abstractmethods__', '__class__', '__contains__', '__del__', '__delattr__', '__delitem__', '__dict__', '__dir__', '__doc__', '__enter__', '__eq__', '__exit__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__slots__', '__str__', '__subclasshook__', '__weakref__', '_abc_cache', '_abc_negative_cache', '_abc_negative_cache_version', '_abc_registry', '_protocol', 'cache', 'clear', 'close', 'dict', 'get', 'items', 'keyencoding', 'keys', 'pop', 'popitem', 'setdefault', 'sync', 'update', 'values', 'writeback']

小结

  1. shelve模块是一个简单的key,value将内存数据通过文件持久化的模块。
  2. shelve模块可以持久化任何pickle可支持的python数据格式。
  3. shelve就是pickle模块的一个封装。
  4. shelve模块是可以多次dump和load。
posted @ 2017-08-02 21:57  Mr.hu  阅读(100)  评论(0编辑  收藏  举报