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)
�]q (X mariaqX dickqX jackyqX sophieqe. �}q (X ageqKX jobqX itqu. �cdatetime
datetime
q C
�0Hq�qRq.
'name', (0, 56) 'date', (1024, 44) 'info', (512, 39)
1.2在OS X 上运行前面的代码
只会创建一个shelve_test.db 文件:
a�(�n}��������cdatetime
datetime
qC
�;(��q�qRq.date�}q(XageqKXjobqXitqu.info�����]q(XmariaqXdickqXjackyqXsophieqe.name����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
注:这些二进制文件包含了存储在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']
小结
- shelve模块是一个简单的key,value将内存数据通过文件持久化的模块。
- shelve模块可以持久化任何pickle可支持的python数据格式。
- shelve就是pickle模块的一个封装。
- shelve模块是可以多次dump和load。