“貨架”是一(yī)個持久的,類似字典的對象。與“dbm”數(shù)據庫的不同之處在于,貨架上(shàng)的值(不是關鍵字!)本質上(shàng)可(kě)以是任意的Python對象 - pickle模塊可(kě)以處理的任何東西(xī)。這(zhè)包括大多數(shù)類實例,遞歸數(shù)據類型和(hé)包含大量共享子對象的對象。鍵是普通(tōng)的字符串。
shelve.open(filename, flag='c', protocol=None, writeback=False)
打開(kāi)一(yī)個持久字典。指定的文件名是底層數(shù)據庫的基本文件名。作(zuò)為(wèi)副作(zuò)用,可(kě)以将擴展名添加到文件名中,并且可(kě)以創建多個文件。默認情況下(xià),打開(kāi)底層數(shù)據庫文件以進行(xíng)讀取和(hé)寫入。可(kě)選的标志參數(shù)與标志參數(shù)的含義相同anydbm.open()。
默認情況下(xià),版本0醬菜用于序列化值。pickle協議(yì)的版本可(kě)以用協議(yì)參數(shù)指定。
在版本2.3中更改:添加了(le)協議(yì)參數(shù)。
由于Python的語義,一(yī)個書(shū)架無法知道(dào)何時(shí)修改了(le)可(kě)變的持久字典條目。默認情況下(xià),修改後的對象僅在分配給貨架時(shí)才寫入(請(qǐng)參閱示例)。如(rú)果可(kě)選寫回參數(shù)設置為(wèi)True,訪問(wèn)的所有項目也緩存在內(nèi)存中,并在寫回sync()和(hé)close(); 這(zhè)可(kě)以更容易地(dì)修改持久性字典中的可(kě)變條目,但(dàn)是,如(rú)果訪問(wèn)了(le)很(hěn)多條目,它可(kě)能(néng)會消耗大量的緩存內(nèi)存,并且它可(kě)以使關閉操作(zuò)非常緩慢(màn),因為(wèi)所有訪問(wèn)的條目都(dōu)被寫回(沒有辦法确定哪些訪問(wèn)條目是可(kě)變的,哪些實際上(shàng)是變異的)。
與文件對象一(yī)樣,應該明(míng)确關閉擱置對象以确保将持久性數(shù)據刷新到磁盤。
警告
由于該shelve模塊由後台支持pickle,因此從(cóng)不受信任的源加載架子是不安全的。像pickle一(yī)樣,加載一(yī)個架子可(kě)以執行(xíng)任意代碼。
貨架對象支持字典支持的大多數(shù)方法。這(zhè)簡化了(le)從(cóng)基于字典的腳本到需要(yào)持久存儲的腳本的過渡。
注意,Python的3過渡的方法(viewkeys(),viewvalues(),和(hé)viewitems())不被支持。
還支持另外(wài)兩種方法:
Shelf.sync()
如(rú)果擱架已打開(kāi)且寫回設置為(wèi),則将高速緩存中的所有條目寫回True。如(rú)果可(kě)行(xíng),還清空緩存并同步磁盤上(shàng)的持久字典。這(zhè)在貨架關閉時(shí)自(zì)動調用close()。
Shelf.close()
同步并關閉持久性字典對象。在一(yī)個封閉的架子上(shàng)操作(zuò)将失敗,一(yī)個ValueError。
1.限制
其中的數(shù)據庫包将被使用的選擇(例如(rú)dbm,gdbm或bsddb)取決于哪個接口是可(kě)用的。因此直接使用打開(kāi)數(shù)據庫是不安全的dbm。數(shù)據庫也(不幸)受限于dbm(如(rú)果使用的話) - 這(zhè)意味着存儲在數(shù)據庫中的對象(腌制表示)應該相當小,并且在極少(shǎo)數(shù)情況下(xià),重要(yào)的沖突可(kě)能(néng)會導緻數(shù)據庫拒絕更新。
該shelve模塊不支持對擱置對象的并發讀取/寫入訪問(wèn)。(多個同時(shí)讀取訪問(wèn)是安全的。)當一(yī)個程序有一(yī)個可(kě)寫入的架子時(shí),其他(tā)程序不應該打開(kāi)它來讀取或寫入。Unix文件鎖定可(kě)以用來解決這(zhè)個問(wèn)題,但(dàn)是這(zhè)在Unix版本中是不同的,并且需要(yào)關于所使用的數(shù)據庫實現的知識。
class shelve.Shelf(dict, protocol=None, writeback=False)
A subclass of UserDict.DictMixin which stores pickled values in the dict object.
默認情況下(xià),版本0醬菜用于序列化值。pickle協議(yì)的版本可(kě)以用協議(yì)參數(shù)指定。請(qǐng)參閱pickle文檔以了(le)解有關鹹菜協議(yì)的讨論。
在版本2.3中更改:添加了(le)協議(yì)參數(shù)。
如(rú)果寫回參數(shù)是True,對象将保存所有訪問(wèn)條目的緩存,并在同步和(hé)關閉時(shí)間(jiān)将它們寫回字典。這(zhè)允許對可(kě)變條目進行(xíng)自(zì)然操作(zuò),但(dàn)可(kě)能(néng)消耗更多內(nèi)存并使同步和(hé)關閉需要(yào)很(hěn)長(cháng)時(shí)間(jiān)。
class shelve.BsdDbShelf(dict, protocol=None, writeback=False)
子類的Shelf暴露first(),next(),previous(),last()和(hé)set_location()是适用于哪些bsddb模塊而不是在其他(tā)數(shù)據庫模塊。傳遞給構造函數(shù)的dict對象必須支持這(zhè)些方法。這(zhè)通(tōng)常是通(tōng)過調用一(yī)個完成的bsddb.hashopen(),bsddb.btopen()或bsddb.rnopen()。可(kě)選的協議(yì)和(hé)寫回參數(shù)與Shelf該類具有相同的解釋。
class shelve.DbfilenameShelf(filename, flag='c', protocol=None, writeback=False)
它的一(yī)個子類Shelf接受一(yī)個文件名而不是一(yī)個類似dict的對象。底層文件将使用打開(kāi)anydbm.open()。默認情況下(xià),該文件将被創建并打開(kāi)以供讀取和(hé)寫入。可(kě)選的标志參數(shù)與該open()功能(néng)具有相同的解釋。可(kě)選的協議(yì)和(hé)寫回參數(shù)與Shelf該類具有相同的解釋。
2.例子
總結界面(key是一(yī)個字符串,data是一(yī)個任意的對象):
import shelve
d = shelve.open(filename) # open -- file may get suffix added by low-level
# library
d[key] = data # store data at key (overwrites old data if
# using an existing key)
data = d[key] # retrieve a COPY of data at key (raise KeyError if no
# such key)
del d[key] # delete data stored at key (raises KeyError
# if no such key)
flag = d.has_key(key) # true if the key exists
klist = d.keys() # a list of all existing keys (slow!)
# as d was opened WITHOUT writeback=True, beware:
d['xx'] = range(4) # this works as expected, but...
d['xx'].append(5) # *this doesn't!* -- d['xx'] is STILL range(4)!
# having opened d without writeback=True, you need to code carefully:
temp = d['xx'] # extracts the copy
temp.append(5) # mutates the copy
d['xx'] = temp # stores the copy right back, to persist it
# or, d=shelve.open(filename,writeback=True) would let you just code
# d['xx'].append(5) and have it work as expected, BUT it would also
# consume more memory and make the d.close() operation slower.
d.close() # close it
網站建設開(kāi)發|APP設計開(kāi)發|小程序建設開(kāi)發