做自(zì)由與創造的先行者

數據持久性 | Data Persistence shelve

Python開(kāi)發手冊

“貨架”是一個持久的,類似字典的對(duì)象。與“dbm”數據庫的不同之處在于,貨架上(shàng)的值(不是關鍵字!)本質上(shàng)可以是任意的Python對(duì)象 - pickle模塊可以處理(lǐ)的任何東西。這(zhè)包括大(dà)多數類實例,遞歸數據類型和(hé)包含大(dà)量共享子對(duì)象的對(duì)象。鍵是普通的字符串。

shelve.open(filename, flag='c', protocol=None, writeback=False)

打開(kāi)一個持久字典。指定的文(wén)件名是底層數據庫的基本文(wén)件名。作(zuò)爲副作(zuò)用(yòng),可以将擴展名添加到(dào)文(wén)件名中,并且可以創建多個文(wén)件。默認情況下(xià),打開(kāi)底層數據庫文(wén)件以進行讀取和(hé)寫入。可選的标志參數與标志參數的含義相同anydbm.open()。

默認情況下(xià),版本0醬菜用(yòng)于序列化值。pickle協議(yì)的版本可以用(yòng)協議(yì)參數指定。

在版本2.3中更改:添加了(le)協議(yì)參數。

由于Python的語義,一個書架無法知(zhī)道(dào)何時(shí)修改了(le)可變的持久字典條目。默認情況下(xià),修改後的對(duì)象僅在分配給貨架時(shí)才寫入(請(qǐng)參閱示例)。如果可選寫回參數設置爲True,訪問的所有項目也(yě)緩存在内存中,并在寫回sync()和(hé)close(); 這(zhè)可以更容易地修改持久性字典中的可變條目,但(dàn)是,如果訪問了(le)很(hěn)多條目,它可能(néng)會(huì)消耗大(dà)量的緩存内存,并且它可以使關閉操作(zuò)非常緩慢,因爲所有訪問的條目都被寫回(沒有辦法确定哪些(xiē)訪問條目是可變的,哪些(xiē)實際上(shàng)是變異的)。

與文(wén)件對(duì)象一樣,應該明(míng)确關閉擱置對(duì)象以确保将持久性數據刷新到(dào)磁盤。

警告

由于該shelve模塊由後台支持pickle,因此從(cóng)不受信任的源加載架子是不安全的。像pickle一樣,加載一個架子可以執行任意代碼。

貨架對(duì)象支持字典支持的大(dà)多數方法。這(zhè)簡化了(le)從(cóng)基于字典的腳本到(dào)需要持久存儲的腳本的過渡。

注意,Python的3過渡的方法(viewkeys(),viewvalues(),和(hé)viewitems())不被支持。

還支持另外(wài)兩種方法:

Shelf.sync()

如果擱架已打開(kāi)且寫回設置爲,則将高(gāo)速緩存中的所有條目寫回True。如果可行,還清空(kōng)緩存并同步磁盤上(shàng)的持久字典。這(zhè)在貨架關閉時(shí)自(zì)動調用(yòng)close()。

Shelf.close()

同步并關閉持久性字典對(duì)象。在一個封閉的架子上(shàng)操作(zuò)将失敗,一個ValueError。

1.限制

其中的數據庫包将被使用(yòng)的選擇(例如dbm,gdbm或bsddb)取決于哪個接口是可用(yòng)的。因此直接使用(yòng)打開(kāi)數據庫是不安全的dbm。數據庫也(yě)(不幸)受限于dbm(如果使用(yòng)的話(huà)) - 這(zhè)意味着存儲在數據庫中的對(duì)象(腌制表示)應該相當小(xiǎo),并且在極少數情況下(xià),重要的沖突可能(néng)會(huì)導緻數據庫拒絕更新。

該shelve模塊不支持對(duì)擱置對(duì)象的并發讀取/寫入訪問。(多個同時(shí)讀取訪問是安全的。)當一個程序有一個可寫入的架子時(shí),其他(tā)程序不應該打開(kāi)它來(lái)讀取或寫入。Unix文(wén)件鎖定可以用(yòng)來(lái)解決這(zhè)個問題,但(dàn)是這(zhè)在Unix版本中是不同的,并且需要關于所使用(yòng)的數據庫實現(xiàn)的知(zhī)識。

class shelve.Shelf(dict, protocol=None, writeback=False)

A subclass of UserDict.DictMixin which stores pickled values in the dict object.

默認情況下(xià),版本0醬菜用(yòng)于序列化值。pickle協議(yì)的版本可以用(yòng)協議(yì)參數指定。請(qǐng)參閱pickle文(wén)檔以了(le)解有關鹹菜協議(yì)的讨論。

在版本2.3中更改:添加了(le)協議(yì)參數。

如果寫回參數是True,對(duì)象将保存所有訪問條目的緩存,并在同步和(hé)關閉時(shí)間将它們寫回字典。這(zhè)允許對(duì)可變條目進行自(zì)然操作(zuò),但(dàn)可能(néng)消耗更多内存并使同步和(hé)關閉需要很(hěn)長時(shí)間。

class shelve.BsdDbShelf(dict, protocol=None, writeback=False)

子類的Shelf暴露first(),next(),previous(),last()和(hé)set_location()是适用(yòng)于哪些(xiē)bsddb模塊而不是在其他(tā)數據庫模塊。傳遞給構造函數的dict對(duì)象必須支持這(zhè)些(xiē)方法。這(zhè)通常是通過調用(yòng)一個完成的bsddb.hashopen(),bsddb.btopen()或bsddb.rnopen()。可選的協議(yì)和(hé)寫回參數與Shelf該類具有相同的解釋。

class shelve.DbfilenameShelf(filename, flag='c', protocol=None, writeback=False)

它的一個子類Shelf接受一個文(wén)件名而不是一個類似dict的對(duì)象。底層文(wén)件将使用(yòng)打開(kāi)anydbm.open()。默認情況下(xià),該文(wén)件将被創建并打開(kāi)以供讀取和(hé)寫入。可選的标志參數與該open()功能(néng)具有相同的解釋。可選的協議(yì)和(hé)寫回參數與Shelf該類具有相同的解釋。

2.例子

總結界面(key是一個字符串,data是一個任意的對(duì)象):

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

網站(zhàn)建設開(kāi)發|APP設計(jì)開(kāi)發|小(xiǎo)程序建設開(kāi)發
下(xià)一篇:數據持久性 | Data Persistence sqlite3
上(shàng)一篇:數據持久性 | Data Persistence pickle