day5-shelve模塊

一、概述

前面章節我們講述了json和pickle模塊的序列化和反序列化處理,他們有一個不足是在python 3中不能多次dump和load,shelve模塊則可以規避這個問題。
shelve模塊是一個簡單的k,v將內存數據通過文件持久化的模塊,可以持久化任何pickle可支持的python數據格式,是pickle 更上一層的封裝。


二、shelve模塊的用法

Shelve模塊提供了基本的存儲操作,Shelve中的open函數在調用的時候返回一個shelf對象,通過該對象可以存儲內容,即像操作字典一樣進行存儲操作。當在該對象中查找元素時,對象會根據已經存儲的版本進行重新構建,當給某個鍵賦值的時候,元素會被存儲。

  • 持久化存儲
      1 import shelve
      2 
      3 def member_info(name, age):
      4     print("Member info:", name, age)
      5 
      6 name = ['Jack', 'Maxwell', 'Tom']
      7 info = {'name':'Maxwell', 'age':18}
      8 
      9 with shelve.open('shelve_demo') as data:
     10     data['name'] = name
     11     data['info'] = info
     12     data['func'] = member_info
    代碼執行后會生成三個文件:
    image
    其中shelve_demo.bak和shelve_demo.dir文件內容相同,顯示如下:
      1 'name', (0, 43)
      2 'info', (512, 45)
      3 'func', (1024, 27)
    shelve_demo.dat猜測為類數據庫文件把。
  • 解析文件內容
      1 import shelve
      2 
      3 def member_info(name, age):
      4     print("Member info:", name, age)
      5 
      6 with shelve.open('shelve_demo') as data:
      7     print(data['name'])    #這里的key與之前保存的文件內容里面的key完全對應,否則會報錯
      8     print(data['info'])
      9     print(data['func']('Alex', 22))
     10 
     11 #運行結果輸出:
     12 ['Jack', 'Maxwell', 'Tom']
     13 {'name': 'Maxwell', 'age': 18}
     14 Member info: Alex 22
     15 None
  • value值的修改
    一般情況下,我們通過shelve來open一個對象后,只能進行一次賦值處理,賦值后不能再次更新處理。
      1 import shelve
      2 
      3 def member_info(name, age):
      4     print("Member info:", name, age)
      5 
      6 name = ['Jack', 'Maxwell', 'Tom']
      7 info = {'name':'Maxwell', 'age':18}
      8 
      9 with shelve.open('shelve_demo') as data:
     10     data['name'] = name
     11     data['info'] = info
     12     data['name'].append('Alex')
     13     print(data['name'])
     14 
     15 程序輸出:
     16 ['Jack', 'Maxwell', 'Tom']  #第一次賦值后apend的元素并沒有生效
    再次open打開結果也是這樣:
      1 import shelve
      2 
      3 def member_info(name, age):
      4     print("Member info:", name, age)
      5 
      6 name = ['Jack', 'Maxwell', 'Tom']
      7 info = {'name':'Maxwell', 'age':18}
      8 
      9 
     10 with shelve.open('shelve_demo') as data:
     11     print(data['name'])
    造成上述情況的原因是:我們只是修改了shelve對象的副本,而它并木有被最終保存。此時我們除了下文要講述的update方法外,還有以下兩種方法:
    方法一: shelve open一個對象后,先用臨時變量指向對象副本,在臨時變量上修改后讓對象副本再次指向臨時變量,從而覆蓋保存對象副本。這種方法的本質是對open后的對象重新賦新值,并非在原有基礎上進行update,也就是open后的對象內存指向地址發生了變化。
      1 import shelve
      2 
      3 def member_info(name, age):
      4     print("Member info:", name, age)
      5 
      6 name = ['Jack', 'Maxwell', 'Tom']
      7 info = {'name':'Maxwell', 'age':18}
      8 
      9 with shelve.open('shelve_demo') as data:
     10     data['name'] = name
     11     data['info'] = info
     12     temp = data['name']  #這里的關鍵點在于對臨時變量的使用
     13     temp.append('Alex')
     14     data['name'] = temp
     15     print(data['name'])
     16 
     17 程序輸出:
     18 ['Jack', 'Maxwell', 'Tom', 'Alex']
    方法二:借助open的writeback=True參數來實現,默認情況下該參數的值為False。
      1 import shelve
      2 
      3 def member_info(name, age):
      4     print("Member info:", name, age)
      5 
      6 name = ['Jack', 'Maxwell', 'Tom']
      7 info = {'name':'Maxwell', 'age':18}
      8 
      9 with shelve.open('shelve_demo', writeback=True) as data:
     10     data['name'] = name
     11     data['info'] = info
     12     data['name'].append('Alex')
     13     print(data['name'])
     14 
     15 程序輸出:
     16 ['Jack', 'Maxwell', 'Tom', 'Alex']

  • update方法
    value值的更新還有一個update方法,使用起來也比較方便:
      1 import shelve
      2 
      3 def member_info(name, age):
      4     print("Member info:", name, age)
      5 
      6 name = ['Jack', 'Maxwell', 'Tom']
      7 info = {'name':'Maxwell', 'age':18}
      8 
      9 with shelve.open('shelve_demo', writeback=True) as data:
     10     data['name'] = name
     11     data['info'] = info
     12     data.update({'name':['Jack', 'Maxwell', 'Tom', 'Alex']})  #這里也是重新賦值
     13     print(data['name'])
     14 
     15 程序輸出:
     16 ['Jack', 'Maxwell', 'Tom', 'Alex']
    重新load一下看看結果:
      1 import shelve
      2 
      3 def member_info(name, age):
      4     print("Member info:", name, age)
      5 
      6 name = ['Jack', 'Maxwell', 'Tom']
      7 info = {'name':'Maxwell', 'age':18}
      8 
      9 
     10 with shelve.open('shelve_demo') as data:
     11     print(data['name'])
     12 
     13 程序輸出:
     14 ['Jack', 'Maxwell', 'Tom', 'Alex']
  • get方法
    通過shelve.open反序列化load對象到內存后,可以通過get方法來獲取key對應的value:
      1 __author__ = 'Maxwell'
      2 
      3 import shelve
      4 
      5 def member_info(name, age):
      6     print("Member info:", name, age)
      7 
      8 name = ['Jack', 'Maxwell', 'Tom']
      9 info = {'name':'Maxwell', 'age':18}
     10 
     11 
     12 with shelve.open('shelve_demo') as data:
     13     print(data.get('name'))
     14 
     15 程序輸出:
     16 ['Jack', 'Maxwell', 'Tom', 'Alex']

三、總結

shelve概念總結:

  • shelve模塊可以看做是pickle模塊的升級版,因為shelve使用的就是pickle的序列化協議,但是shelve比pickle提供的操作方式更加簡單、方便。
  • shelve模塊相對于其它兩個模塊在將Python數據持久化到本地磁盤時有一個很明顯的優點就是,它允許我們可以像操作dict一樣操作被序列化的數據,而不必一次性的保存或讀取所有數據。
  • shelve模塊持久化支持更多的python數據類型

使用建議:

  1. 需要與外部系統交互時用json模塊;
  2. 需要將少量、簡單Python數據持久化到本地磁盤文件時可以考慮用pickle模塊;
  3. 需要將大量Python數據持久化到本地磁盤文件或需要一些簡單的類似數據庫的增刪改查功能時,可以考慮用shelve模塊。

以上內容摘自大神博客http://www.cnblogs.com/yyds/p/6563608.html




轉載于:https://www.cnblogs.com/linupython/p/8273858.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/252525.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/252525.shtml
英文地址,請注明出處:http://en.pswp.cn/news/252525.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

程序員:請你不要對業務「置之不理」

成長是條孤獨的路,一個人會走得更快;有志同道合者同行,會走得更遠。本篇內容整理自 21 天鯤鵬新青年計劃線上分享內容。鯤鵬新青年計劃是由 TGO 鯤鵬會組織的線上分享活動,希望能幫助更多同學一起學習、成長。12 月 28 日&#xf…

在Ubuntu系統下如何將chrome瀏覽器的bookmarks導出到本地

1. 打開chrome瀏覽器在頁面的右上角點擊那個三個小點的位置,找到bookmarks,然后點擊bookmarks manager,然后在organize右側大倒三角下選擇,export bookmarks to HTML,選擇要保存的位置,利用同樣的方法下次就可以直接導…

php基于數組的分頁實現

關于數組的分頁函數,用數組進行分頁的好處是可以方便的進行聯合多表查詢,只需要將查詢的結果放在數組中就可以了以下是數組分頁的函數,函數page_array用于數組的分頁,函數show_array用于分頁函數的操作及顯示,需要配合使用.兩個函數通過全局變量$countpa…

028 -bash-4.1$ 出現故障的原理及解決辦法?

最近在搭建分布式的時候,出現了這個問題,很不爽。下面是我的解決方式。 1.在用戶下刪除bash rm -rf /home/beifeng/.bash* 2.拷貝 cp /etc/skel/.bash* /home/beifeng 3.退出,再進入用戶 4.解釋 set |grep -i ps1 轉載于:https://www.cnblogs…

彈出ifream

top.$.jBox("iframe:"${ctx}/synopsis/hmlwxSynopsis/addItem, {title: "添加作品",width: 1000, height: 500, buttons:{關閉: true,確定:ok},submit:function(v, h, f){},loaded: function (jboxContent) {$(jboxContent).css(overflow-x,);$(jboxConten…

ORB-SLAM2中的Loop Closinng中DetectLoopCandidates函數解析

/函數的三要素是&#xff1a;函數返回值類型&#xff0c;函數名稱&#xff0c;函數參數 函數的返回值是裝有關鍵幀指針的vector 該函數是類KeyFrameDatabase的成員函數,函數名是DetectLoopCandidate 該函數的參數分別是KeyFrame類型的指針變量 pKF和最小得分vector<KeyFrame…

NYOJ2—括號配對問題

括號配對問題 時間限制&#xff1a;3000 ms | 內存限制&#xff1a;65535 KB 難度&#xff1a;3描述現在&#xff0c;有一行括號序列&#xff0c;請你檢查這行括號是否配對。輸入第一行輸入一個數N&#xff08;0<N<100&#xff09;,表示有N組測試數據。后面的N行輸入多…

李彥宏千字愿景內部信:10次提到“用戶”

中新網1月17日電 1月17日&#xff0c;百度公司創始人、董事長兼CEO李彥宏發出一封內部信&#xff0c;信中&#xff0c;李彥宏向員工闡述了百度愿景&#xff1a;成為最懂用戶&#xff0c;并能幫助人們成長的全球頂級高科技公司。他提出&#xff0c;百度要持續創新&#xff0c;“…

spring-boot 速成(8) 集成druid+mybatis

spring-boot與druid、mybatis集成&#xff08;包括pageHelper分頁插件&#xff09;, 要添加以下幾個依賴項: compile(mysql:mysql-connector-java:6.0.5)compile(tk.mybatis:mapper-spring-boot-starter:1.1.1)compile(org.mybatis.spring.boot:mybatis-spring-boot-starter:1.…

ORB-SLAM2中生成金字塔提取FAST角點和計算BRIEF描述子

//這個是類ORBextractor的帶參構造函數&#xff0c;并且使用初始化列表對該類中的這5個變量賦值 ORBextractor::ORBextractor(int _nfeatures, float _scaleFactor, int _nlevels,int _iniThFAST, int _minThFAST):nfeatures(_nfeatures), scaleFactor(_scaleFactor), nlevels(…

我們怎樣確保從大數據計算中獲得價值

我們怎樣確保從大數據計算中獲得價值 支持大數據方案并不是在硬件以及軟件層次終止&#xff0c;企業要想真正地從大數據中受益&#xff0c;領導者必須改變思考與對待信息的方式。 我們怎樣確保從大數據計算中獲得價值&#xff1f; 當所有可用數據都可用時&#xff0c;大數據…

jsoncpp-src-0.5.0.tar.gz 源碼錯誤!!!!

近期在做畢設&#xff0c;使用到了JsonCpp0.5.0版本號的源碼&#xff01;依照網上的安裝配置教程&#xff0c;搭建好環境后就能夠使用了&#xff01; 在這里就不浪費空間去將怎樣搭建開發環境了&#xff01;請大家去google一下就好了&#xff01;在解析一個Json文件時。程序總是…

青海省多地日降水量突破歷史極值

受高原槽和西北冷空氣的共同影響&#xff0c;青海省海西州茫崖等多地日降水量突破歷史極值。 李萬花 攝 受高原槽和西北冷空氣的共同影響&#xff0c;青海省海西州茫崖等多地日降水量突破歷史極值。 李萬花 攝 中新網西寧1月18日電 (孫睿 趙海梅)記者18日從青海省氣象局獲悉&am…

ORB-SLAM2中四叉樹管理特征點

當從圖像金字塔中的每一層圖像上提取特征點之后&#xff0c;都要先用四叉樹技術對這些特征點進行管理 //該類中定義了四叉樹創建的函數以及樹中結點的屬性 //bool bNoMore&#xff1a; 根據該結點中被分配的特征點的數目來決定是否繼續對其進行分割 //DivisionNode()&#xff…

Python多線程3:queue

queue模塊實現了多生產者。多消費者隊列。在多線程環境下&#xff0c;該隊列能實現多個線程間安全的信息交換。 queue模塊介紹 模塊實現了3種類型的隊列&#xff0c;差別在于隊列中條目檢索的順序不同。在FIFO隊列中。依照先進先出的順序檢索條目。在LIFO隊列中&#xff0c;最后…

微信小程序教程02:App(Object)和Page(Object) 構造器介紹

在/app.js中&#xff0c;有方法App&#xff0c;它的作用是注冊整個小程序的應用&#xff0c;其中可以傳入一些配置&#xff0c;或者存儲全局狀態。 App(Object) 構造器生命周期 屬性類型描述onLaunchFunction在小程序初始化時觸發&#xff0c;全局僅觸發一次onShowFunction小程…

阿里云.log

申請證書審核失敗的原因及處理方法;( 新添加站點 免費版 SSL 網頁內不能有 HTTPS的連接&#xff1b;更多點擊連接) 轉載于:https://www.cnblogs.com/q1104460935/p/8287377.html

SharePoint Search之(七)Search result- 結果源

在使用搜索引擎的時候。非常多情況下&#xff0c;用戶希望限定一下搜索范圍&#xff0c;以便更加easy找到想要的結果。在SharePoint 2013的search里&#xff0c;也支持類似的功能&#xff0c;SharePoint 默認提供了幾種范圍&#xff1a; 在SharePoint&#xff0c;這個叫Search …

曠視砸20億進軍AIoT,發布國內首個機器人協作大腦河圖

1 月 16 日&#xff0c;人工智能獨角獸曠視科技發布了機器人戰略&#xff0c;以及自 2018 年 4 月收購艾瑞思機器人&#xff0c;進軍機器人領域的最新進展——智能協同大腦河圖。在會上&#xff0c;曠視還大筆一揮&#xff0c;決定投入 20 億元&#xff0c;用于打造物流倉儲上下…