0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

python序列化對象

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

1.1 python序列化對象

序列化對象:將對象轉(zhuǎn)換為可以存儲或傳輸?shù)男问健?/p>

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

(2) 用于傳輸:發(fā)送方把對象轉(zhuǎn)換為字節(jié)序列,接收方字節(jié)序列恢復(fù)為對象。

反序列化:將存儲或傳輸?shù)淖止?jié)序列恢復(fù)為對象。

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

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

對象格式化:將對象轉(zhuǎn)換為字節(jié)串。

解格式化:用字節(jié)串創(chuàng)建原始對象。

把對象轉(zhuǎn)為pickle字符串,存儲在文件中,進(jìn)行持久化保存。

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

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

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

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

python通過shelve模塊將python對象存儲到本地文件,以及從本地文件恢復(fù)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:導(dǎo)入shelve模塊

filename:文件名,生成shelve文件時(shí)的名字

flag:

NO flag值 描述
1 r 只讀模式打開文件
2 w 讀寫模式打開文件
3 c 讀寫模式打開文件,文件不存在則新建
4 n 創(chuàng)建一個(gè)新的、空數(shù)據(jù)的文件

protocol:序列化模式,1或2表示二進(jìn)制形式

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

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

db**.**close:關(guān)閉文件連接

生成.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++開發(fā)',20000)
>>> mm1 = MyManager('mm1','開發(fā)經(jīng)理',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文件后,跟使用字典一樣訪問數(shù)據(jù)。

可以用[]或get讀取數(shù)據(jù)。

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

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

1.4 更新shelve文件

可以調(diào)用shelve文件存儲的python對象所有的方法更新對象數(shù)據(jù)。

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

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

    關(guān)注

    13

    文章

    4134

    瀏覽量

    85312
  • python
    +關(guān)注

    關(guān)注

    53

    文章

    4753

    瀏覽量

    84106
收藏 人收藏

    評論

    相關(guān)推薦

    如何使用Serde進(jìn)行序列化和反序列化

    Serde 是一個(gè)用于序列化和反序列化 Rust 數(shù)據(jù)結(jié)構(gòu)的庫。它支持 JSON、BSON、YAML 等多種格式,并且可以自定義序列化和反序列化方式。Serde 的特點(diǎn)是代碼簡潔、易于
    的頭像 發(fā)表于 09-30 17:09 ?1173次閱讀

    Java序列化的機(jī)制和原理

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

    c語言序列化和反序列化有何區(qū)別

    這里寫自定義目錄標(biāo)題c語言序列化和反序列化tplut.htplut.c測試代碼參考c語言序列化和反序列化網(wǎng)絡(luò)調(diào)用,數(shù)據(jù)傳輸都需要把數(shù)據(jù)序列化
    發(fā)表于 07-14 07:32

    關(guān)于c語言序列化和反序列化的知識點(diǎn)看完你就懂了

    關(guān)于c語言序列和反序列化的知識點(diǎn)你就懂了
    發(fā)表于 10-15 08:47

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

    的JSON請求反序列化對象時(shí),就會出現(xiàn)String類型的值,前后有空格,現(xiàn)需要一個(gè)統(tǒng)一的處理方法,對接收的String類型屬性執(zhí)行trim方法。解決方案SpringMVC默認(rèn)的JSON框架為jackson
    發(fā)表于 10-10 16:02

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

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

    理解PHP反序列化漏洞

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

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

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

    分享一個(gè)最新的的Python對象序列化方式

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

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

    實(shí)現(xiàn)序列化和反序列化為什么要實(shí)現(xiàn)Serializable接口?
    的頭像 發(fā)表于 07-15 11:03 ?1669次閱讀

    C#實(shí)現(xiàn)對象序列化的三種方式是什么

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

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

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

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

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

    Java序列化怎么使用

    轉(zhuǎn)換方式就叫做序列化。將文件或者網(wǎng)絡(luò)傳輸中得到的 byte[] 數(shù)組轉(zhuǎn)換為 java 對象就叫做反序列化。 怎么使用 如果一個(gè) Java 對象要能被
    的頭像 發(fā)表于 10-10 14:19 ?356次閱讀

    什么時(shí)候需要Boost序列化

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