最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python3 shelve對(duì)象持久存儲(chǔ)原理詳解

 更新時(shí)間:2020年03月23日 10:32:24   作者:愛編程的小灰灰  
這篇文章主要介紹了Python3 shelve對(duì)象持久存儲(chǔ)原理詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

1.shelve對(duì)象的持久存儲(chǔ)

不需要關(guān)系數(shù)據(jù)庫(kù)時(shí),可以用shelve模塊作為持久存儲(chǔ)Python對(duì)象的一個(gè)簡(jiǎn)單的選擇。類似于字典,shelf按鍵訪問。值將被pickled并寫至由dbm創(chuàng)建和管理的數(shù)據(jù)庫(kù)。

1.1 創(chuàng)建一個(gè)新shelf

使用shelve最簡(jiǎn)單的方法就是利用DbfilenameShelf類。它使用dbm存儲(chǔ)數(shù)據(jù)。這個(gè)類可以直接使用,也可以通過調(diào)用shelve.open()來使用。

import shelve
with shelve.open('test_shelf.db') as s:
  s['key1'] = {
    'int': 10,
    'float': 9.5,
    'string': 'Sample data',
  }

再次訪問這個(gè)數(shù)據(jù),可以打開shelf,并像字典一樣使用它。

import shelve
with shelve.open('test_shelf.db') as s:
  existing = s['key1']
print(existing)

運(yùn)行這兩個(gè)示例腳本會(huì)生成以下輸出。

dbm模塊不支持多個(gè)應(yīng)用同時(shí)寫同一個(gè)數(shù)據(jù)庫(kù),不過它支持并發(fā)的只讀客戶。如果一個(gè)客戶沒有修改shelf,則可以通過傳入flag='r'來告訴shelve以只讀方式打開數(shù)據(jù)庫(kù)。

import dbm
import shelve
with shelve.open('test_shelf.db', flag='r') as s:
  print('Existing:', s['key1'])
  try:
    s['key1'] = 'new value'
  except dbm.error as err:
    print('ERROR: {}'.format(err))

如果數(shù)據(jù)庫(kù)作為只讀數(shù)據(jù)源打開,并且程序試圖修改數(shù)據(jù)庫(kù),那么便會(huì)生成一個(gè)訪問錯(cuò)誤異常。具體的異常類型取決于創(chuàng)建數(shù)據(jù)庫(kù)時(shí)dbm選擇的數(shù)據(jù)庫(kù)模塊。

1.2 寫回

默認(rèn)的,shelf不會(huì)跟蹤對(duì)可變對(duì)象的修改。這說明,如果存儲(chǔ)在shelf中的一個(gè)元素的內(nèi)容有變化,那么shelf必須再次存儲(chǔ)整個(gè)元素來顯式的更新。

import shelve
with shelve.open('test_shelf.db') as s:
  print(s['key1'])
  s['key1']['new_value'] = 'this was not here before'
with shelve.open('test_shelf.db', writeback=True) as s:
  print(s['key1'])

在這個(gè)例子中,沒有再次存儲(chǔ)'key1'的相應(yīng)字典,所以重新打開shelf時(shí),修改不會(huì)保留。

對(duì)于shelf中存儲(chǔ)的可變對(duì)象,要想自動(dòng)捕獲對(duì)它們的修改,可以在打開shelf時(shí)啟用寫回(writeback)。writeback標(biāo)志會(huì)讓shelf使用內(nèi)存中緩存以記住從數(shù)據(jù)庫(kù)獲取的所有對(duì)象。shelf關(guān)閉時(shí)每個(gè)緩存對(duì)象也被寫回到數(shù)據(jù)庫(kù)。

import shelve
import pprint
with shelve.open('test_shelf.db', writeback=True) as s:
  print('Initial data:')
  pprint.pprint(s['key1'])
  s['key1']['new_value'] = 'this was not here before'
  print('\nModified:')
  pprint.pprint(s['key1'])
with shelve.open('test_shelf.db', writeback=True) as s:
  print('\nPreserved:')
  pprint.pprint(s['key1'])

盡管這會(huì)減少程序員犯錯(cuò)的機(jī)會(huì),并且使對(duì)象持久存儲(chǔ)更透明,但是并非所有情況都有必要使用寫回模式。打開shelf時(shí)緩存會(huì)消耗額外的內(nèi)容,關(guān)閉shelf時(shí)會(huì)暫時(shí)將各個(gè)緩存對(duì)象寫回到數(shù)據(jù)庫(kù),這會(huì)減慢應(yīng)用的速度。所有緩存的對(duì)象都要寫回?cái)?shù)據(jù)庫(kù),因?yàn)闊o法區(qū)分它們是否有修改。如果應(yīng)用讀取的數(shù)據(jù)多于寫的數(shù)據(jù),那么寫回就會(huì)影響性能而沒有太大意義。

1.3 特定shelf類型

之前的例子都使用了默認(rèn)的shelf實(shí)現(xiàn)??梢允褂胹helve.open()而不是直接使用某個(gè)shelf實(shí)現(xiàn),這是一種常用的用法,特別是使用什么類型的數(shù)據(jù)庫(kù)來存儲(chǔ)數(shù)據(jù)并不重要時(shí)。不過,有些情況下數(shù)據(jù)庫(kù)格式會(huì)很重要。在這些情況下,可以直接使用DbfilenameShelf或BsdDbshelf,或者甚至可以派生Shelf來得到一個(gè)定制解決方案。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • pygame 精靈的行走及二段跳的實(shí)現(xiàn)方法(必看篇)

    pygame 精靈的行走及二段跳的實(shí)現(xiàn)方法(必看篇)

    下面小編就為大家?guī)硪黄猵ygame 精靈的行走及二段跳的實(shí)現(xiàn)方法(必看篇)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-07-07
  • Python如何對(duì)XML 解析

    Python如何對(duì)XML 解析

    這篇文章主要介紹了Python對(duì)XML 解析的方法,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • Python繪制并保存指定大小圖像的方法

    Python繪制并保存指定大小圖像的方法

    今天小編就為大家分享一篇Python繪制并保存指定大小圖像的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • 深入理解python?生成器、迭代器、動(dòng)態(tài)新增屬性及方法

    深入理解python?生成器、迭代器、動(dòng)態(tài)新增屬性及方法

    這篇文章主要介紹了python?生成器、迭代器、動(dòng)態(tài)新增屬性及方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-04-04
  • python輸出第n個(gè)默尼森數(shù)的實(shí)現(xiàn)示例

    python輸出第n個(gè)默尼森數(shù)的實(shí)現(xiàn)示例

    這篇文章主要介紹了python輸出第n個(gè)默尼森數(shù)的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • python?nonlocal的用法詳解

    python?nonlocal的用法詳解

    這篇文章主要給大家介紹了關(guān)于python?nonlocal用法的相關(guān)資料,最近在python學(xué)習(xí)中遇到了nonlocal關(guān)鍵字但是感到困惑,于是記錄nonlocal關(guān)鍵字用法,需要的朋友可以參考下
    2023-10-10
  • Python實(shí)現(xiàn)為pdf添加水印功能

    Python實(shí)現(xiàn)為pdf添加水印功能

    這篇文章主要介紹了Python實(shí)現(xiàn)給普通PDF添加水印的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • Python入門教程(二十六)Python的模塊

    Python入門教程(二十六)Python的模塊

    這篇文章主要介紹了Python入門教程(二十六)Python的模塊,Python是一門非常強(qiáng)大好用的語言,也有著易上手的特性,本文為入門教程,需要的朋友可以參考下
    2023-04-04
  • 解決Python列表字符不區(qū)分大小寫的問題

    解決Python列表字符不區(qū)分大小寫的問題

    今天小編就為大家分享一篇解決Python列表字符不區(qū)分大小寫的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • Python用list或dict字段模式讀取文件的方法

    Python用list或dict字段模式讀取文件的方法

    這篇文章主要給大家介紹了Python利用list字段模式或者dict字段模式讀取文件的方法,文中給出了詳細(xì)的介紹和示例代碼,相信對(duì)大家的理解和學(xué)習(xí)具有一定的參考借鑒價(jià)值,有需要的朋友可以跟著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-01-01

最新評(píng)論

长白| 双柏县| 若尔盖县| 张家川| 元谋县| 扶沟县| 门头沟区| 临泽县| 毕节市| 措勤县| 清新县| 安化县| 策勒县| 田东县| 元阳县| 手游| 吉首市| 孝义市| 定州市| 大石桥市| 潼关县| 北川| 林西县| 平安县| 凌海市| 湟源县| 光山县| 彭水| 时尚| 高雄市| 广州市| 通榆县| 黄山市| 马山县| 津南区| 恭城| 临湘市| 娄烦县| 靖边县| 阳城县| 三台县|