永久字典shelve
2017-01-01 本文已影响0人
Black先森
对于字典肯定非常熟悉,这是Python的内置数据类型,特点是拥有键值对的数据,
通过键访问值的速度非常快,原因是字典主要存储在内存中,通过hash存储映射
关系。缺点就是程序结束以后,字典将不能访问了。为了解决字典的这个缺陷,因此
用了这个永久字典。本文主要讲解永久字典的使用。
永久字典是将字典写成文件,存储在硬盘。当然速度比字典稍慢,但使用永久字典的
方法却非常简单,这都仰仗开源的各路大神封装得非常方便。
import shelve
db = shelve.open("gg.dat", 'c')
for key, value in zip("abcde", range(5)):
db[key] = value
for k, v in db.items():
print k, v
db.close()
>>> b 1
d 3
a 0
c 2
e 4
打开永久字典文件以后,就跟操作字典完全一样了,字典的值当然可以是
数值,列表,元组等类型。值得注意的是永久字典的key必须为str类型 如果是unicode
则会报错,值为unicode类型是可以的。这是底层封装
对字符集的处理问题,使用的时候按照规则来就行,如果要纠结这个问题,
那就看封装的源码吧。
import shelve
db = shelve.open("gg.dat", 'c')
db[u"name"] = u"Vincent"
db.close()
>>> Traceback (most recent call last):
File "E:/workspace/demo/demo.py", line 10, in <module>
db[u"name"] = u"Vincent"
File "C:\Python27\lib\shelve.py", line 133, in __setitem__
self.dict[key] = f.getvalue()
File "C:\Python27\lib\bsddb\__init__.py", line 279, in __setitem__
_DeadlockWrap(wrapF) # self.db[key] = value
File "C:\Python27\lib\bsddb\dbutils.py", line 68, in DeadlockWrap
return function(*_args, **_kwargs)
File "C:\Python27\lib\bsddb\__init__.py", line 278, in wrapF
self.db[key] = value
TypeError: String or Integer object expected for key, unicode found
永久的字典的后缀名不一定是dat,可以没有后缀名,但最好是dat活着db
这样的便于识别的名称。