對于字典肯定非常熟悉掸绞,這是Python的內(nèi)置數(shù)據(jù)類型,特點是擁有鍵值對的數(shù)據(jù)咽安,
通過鍵訪問值的速度非嘲橥快,原因是字典主要存儲在內(nèi)存中妆棒,通過hash存儲映射
關(guān)系澡腾。缺點就是程序結(jié)束以后,字典將不能訪問了糕珊。為了解決字典的這個缺陷动分,因此
用了這個永久字典。本文主要講解永久字典的使用红选。
永久字典是將字典寫成文件澜公,存儲在硬盤。當然速度比字典稍慢喇肋,但使用永久字典的
方法卻非常簡單玛瘸,這都仰仗開源的各路大神封裝得非常方便。
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
打開永久字典文件以后苟蹈,就跟操作字典完全一樣了,字典的值當然可以是
數(shù)值右核,列表慧脱,元組等類型。值得注意的是永久字典的key必須為str類型 如果是unicode
則會報錯贺喝,值為unicode類型是可以的菱鸥。這是底層封裝
對字符集的處理問題,使用的時候按照規(guī)則來就行躏鱼,如果要糾結(jié)這個問題氮采,
那就看封裝的源碼吧。
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
這樣的便于識別的名稱。