精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

python序列化對象

jf_78858299 ? 來源:梯閱線條 ? 作者:小梯子 ? 2023-03-10 09:57 ? 次閱讀

1.1 python序列化對象

序列化對象:將對象轉換為可以存儲或傳輸的形式。

(1) 用于存儲:將對象的字節序列存儲到文件中,程序退出后不會消失,便于后續使用。

(2) 用于傳輸:發送方把對象轉換為字節序列,接收方字節序列恢復為對象。

反序列化:將存儲或傳輸的字節序列恢復為對象。

NO 模塊 描述
1 pickle python對象和字節串間的序列化
2 dbm 通過鍵訪問文件,用于存儲字符串
3 shelve 使用pickle和dbm按照鍵將python對象存儲到文件

python的pickle模塊是對象格式化和解格式化工具。

對象格式化:將對象轉換為字節串。

解格式化:用字節串創建原始對象。

把對象轉為pickle字符串,存儲在文件中,進行持久化保存。

從文件載入pickle字符串,通過unpickle操作,創建原始對象。

shelve將pickle字符串,按鍵值模式,存儲在dbm文件中。

shelve從dbm文件按鍵獲取pickle字符串,創建原始對象。

shelve通過鍵存儲和獲取本地python對象,到達跨程序運行和持久化的效果。

python通過shelve模塊將python對象存儲到本地文件,以及從本地文件恢復python對象。

1.2 shelve存儲python對象

用法

import shelve
db=shelve.open(filename, flag='c', protocol=None, writeback=False)
db['k']=value
db.close
with shelve.open(filename, flag='c', protocol=None, writeback=False) as db:
   db['k']=value
   pass

描述

import shelve:導入shelve模塊

filename:文件名,生成shelve文件時的名字

flag:

NO flag值 描述
1 r 只讀模式打開文件
2 w 讀寫模式打開文件
3 c 讀寫模式打開文件,文件不存在則新建
4 n 創建一個新的、空數據的文件

protocol:序列化模式,1或2表示二進制形式

writeback:緩存回寫。True,表示在close的時候,將緩存中的全部對象重新寫入到shelve文件。

db**[ 'k' ]=**value:字典方式賦值向shelve文件寫數據

db**.**close:關閉文件連接

生成.bak,.dat,.dir文件。

示例

>>> import os
>>> os.chdir(r'E:\\documents\\F盤')
>>> from myperson import MyPerson,MyManager
>>> import shelve
>>> mp1 = MyPerson('mp1')
>>> mp2 = MyPerson('mp2','c++開發',20000)
>>> mm1 = MyManager('mm1','開發經理',50000)
# 普通open()
>>> sdb = shelve.open('mypersondb')
>>> for obj in (mp1,mp2,mm1):
   sdb[obj.name] = obj
>>> sdb.close()
>>> import glob
>>> glob.glob('myperson*')
# 生成 .bak,.dat,.dir 文件
['myperson.py', 'mypersondb.bak', 'mypersondb.dat', 'mypersondb.dir']
# with shelve.open()
>>> with shelve.open('withopendb') as wdb:
   for obj in (mp1,mp2,mm1):
       wdb[obj.name] = obj
>>> glob.glob('withopen*')
['withopendb.bak', 'withopendb.dat', 'withopendb.dir']

1.3 讀取shelve文件

打開shelve文件后,跟使用字典一樣訪問數據。

可以用[]或get讀取數據。

>>> rdb = shelve.open('mypersondb')
>>> len(rdb)
3
>>> list(rdb.keys())
['mp1', 'mp2', 'mm1']
>>> for k in rdb:
   print(k,'->',rdb[k])#[]獲取字典數據
mp1 -> MyPerson:job=None,name=mp1,pay=0
mp2 -> MyPerson:job=c++開發,name=mp2,pay=20000
mm1 -> MyManager:job=開發經理,name=mm1,pay=50000
rdb.close()

>>> with shelve.open('mypersondb') as srdb:
   for k in srdb:
       print(k,'->',srdb.get(k))#get 獲取字典數據
mp1 -> MyPerson:job=None,name=mp1,pay=0
mp2 -> MyPerson:job=c++開發,name=mp2,pay=20000
mm1 -> MyManager:job=開發經理,name=mm1,pay=50000

1.4 更新shelve文件

可以調用shelve文件存儲的python對象所有的方法更新對象數據。

NO writebacke 描述
1 False 通過中間變量存放對象并進行更新,之后再指向中間變量,close后進行保存。
2 True 可以不用中間變量,close的時候會自動將緩存中全部對象重新寫到shelve文件。
>>> rdb = shelve.open('mypersondb')
# 從shelve文件獲取對象,用中變量存放
>>> mm1=rdb['mm1']
>>> print(mm1)
MyManager:job=開發經理,name=mm1,pay=50000
>>> type(mm1)

# 調用對象方法更新數據
>>> mm1.payraise(0.1)
# 更新shelve對象指向最新的對象
>>> rdb['mm1']=mm1
# close()后保存shelve文件
>>> rdb.close()
>>> rdb = shelve.open('mypersondb')
>>> print(rdb['mm1'])
# 獲取的對象為更新后的對象
MyManager:job=開發經理,name=mm1,pay=60000
>>> rdb.close()
# writebacke=True,close時自動將緩存數據重新寫到shelve文件。
>>> rdb = shelve.open('mypersondb',writeback=True)
>>> print(rdb['mm1'])
MyManager:job=開發經理,name=mm1,pay=60000
>>> rdb['mm1'].payraise(0.1)
>>> rdb.close()
>>> rdb = shelve.open('mypersondb')
>>> print(rdb['mm1'])
MyManager:job=開發經理,name=mm1,pay=72000
>>> rdb.close()
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 存儲
    +關注

    關注

    13

    文章

    4262

    瀏覽量

    85669
  • python
    +關注

    關注

    56

    文章

    4782

    瀏覽量

    84453
收藏 人收藏

    評論

    相關推薦

    如何使用Serde進行序列化和反序列化

    Serde 是一個用于序列化和反序列化 Rust 數據結構的庫。它支持 JSON、BSON、YAML 等多種格式,并且可以自定義序列化和反序列化方式。Serde 的特點是代碼簡潔、易于
    的頭像 發表于 09-30 17:09 ?1253次閱讀

    Java序列化的機制和原理

    本文講解了Java序列化的機制和原理。從文中你可以了解如何序列化一個對象,什么時候需要序列化以及Java序列化的算法。AD:WOT2014課
    發表于 07-10 07:27

    c語言序列化和反序列化有何區別

    這里寫自定義目錄標題c語言序列化和反序列化tplut.htplut.c測試代碼參考c語言序列化和反序列化網絡調用,數據傳輸都需要把數據序列化
    發表于 07-14 07:32

    關于c語言序列化和反序列化的知識點看完你就懂了

    關于c語言序列和反序列化的知識點你就懂了
    發表于 10-15 08:47

    SpringMVC JSON框架的自定義序列化與反序列化

    的JSON請求反序列化對象時,就會出現String類型的值,前后有空格,現需要一個統一的處理方法,對接收的String類型屬性執行trim方法。解決方案SpringMVC默認的JSON框架為jackson
    發表于 10-10 16:02

    Java對象序列化您不知道的5件事

    本文是本系列的第一篇文章,這個系列專門揭示關于 Java 平臺的一些有用 的小知識 — 這些小知識不易理解,但對于解決 Java 編程挑戰遲早有用。 將 Java 對象序列化 API 作為
    發表于 11-23 17:53 ?20次下載

    理解PHP反序列化漏洞

    理解PHP反序列化漏洞
    發表于 09-07 11:03 ?7次下載
    理解PHP反<b class='flag-5'>序列化</b>漏洞

    java序列化和反序列化范例和JDK類庫中的序列化API

    一、序列化和反序列化的概念 把對象轉換為字節序列的過程稱為對象序列化。 把字節
    發表于 09-27 10:13 ?6次下載

    分享一個最新的的Python對象序列化方式

    許多Python標準庫都有一些未被賞識的精華。其中之一是允許簡單優雅的基于參數類型的函數分發。這一特性對于任意對象序列化而言是非常完美的——例如對于web API的JSON或結構
    的頭像 發表于 09-01 15:19 ?2689次閱讀
    分享一個最新的的<b class='flag-5'>Python</b><b class='flag-5'>對象</b><b class='flag-5'>序列化</b>方式

    static屬性為什么不會被序列化

    實現序列化和反序列化為什么要實現Serializable接口?
    的頭像 發表于 07-15 11:03 ?1734次閱讀

    C#實現對象序列化的三種方式是什么

    很多小伙伴一提到序列化,都會想到二進制序列化,但其實序列化并不僅僅只是二進制序列化,我們常說的對象序列化
    的頭像 發表于 02-22 16:11 ?1159次閱讀
    C#實現<b class='flag-5'>對象</b><b class='flag-5'>序列化</b>的三種方式是什么

    螞蟻集團開源高性能多語言序列化框架Fury解讀

    Fury 是一個基于 JIT 動態編譯和零拷貝的多語言序列化框架,支持 Java/Python/Golang/JavaScript/C++ 等語言,提供全自動的對象多語言 / 跨語言序列化
    的頭像 發表于 08-25 17:05 ?1133次閱讀
    螞蟻集團開源高性能多語言<b class='flag-5'>序列化</b>框架Fury解讀

    什么是序列化 為什么要序列化

    什么是序列化? “序列化”(Serialization )的意思是將一個對象轉化為字節流。 這里說的對象可以理解為“面向對象”里的那個
    的頭像 發表于 09-14 17:22 ?2445次閱讀
    什么是<b class='flag-5'>序列化</b> 為什么要<b class='flag-5'>序列化</b>

    Java序列化怎么使用

    轉換方式就叫做序列化。將文件或者網絡傳輸中得到的 byte[] 數組轉換為 java 對象就叫做反序列化。 怎么使用 如果一個 Java 對象要能被
    的頭像 發表于 10-10 14:19 ?424次閱讀

    什么時候需要Boost序列化

    () const { return m_strName;} private :std::string m_strName;}; 然后我們想把這個類的一個對象保存到文件中或者通過網絡發出去,怎么辦呢?答案就是:把這個對象序列化
    的頭像 發表于 11-10 10:14 ?402次閱讀