實(shí)例講解python中的序列化知識(shí)點(diǎn)
在程序運(yùn)行的過(guò)程中,所有的變量都是在內(nèi)存中,比如,定義一個(gè)dict:
d = dict(name='Bob', age=20, score=88)
可以隨時(shí)修改變量,比如把name改成'Bill',但是一旦程序結(jié)束,變量所占用的內(nèi)存就被操作系統(tǒng)全部回收。如果沒(méi)有把修改后的'Bill'存儲(chǔ)到磁盤上,下次重新運(yùn)行程序,變量又被初始化為'Bob'。
我們把變量從內(nèi)存中變成可存儲(chǔ)或傳輸?shù)倪^(guò)程稱之為序列化,在Python中叫pickling,在其他語(yǔ)言中也被稱之為serialization,marshalling,flattening等等,都是一個(gè)意思。
序列化之后,就可以把序列化后的內(nèi)容寫入磁盤,或者通過(guò)網(wǎng)絡(luò)傳輸?shù)絼e的機(jī)器上。
反過(guò)來(lái),把變量?jī)?nèi)容從序列化的對(duì)象重新讀到內(nèi)存里稱之為反序列化,即unpickling。
Python提供了pickle模塊來(lái)實(shí)現(xiàn)序列化。
首先,我們嘗試把一個(gè)對(duì)象序列化并寫入文件:
>>> import pickle >>> d = dict(name='Bob', age=20, score=88) >>> pickle.dumps(d) b'\x80\x03}q\x00(X\x03\x00\x00\x00ageq\x01K\x14X\x05\x00\x00\x00scoreq\x02KXX\x04\x00\x00\x00nameq\x03X\x03\x00\x00\x00Bobq\x04u.'
pickle.dumps()方法把任意對(duì)象序列化成一個(gè)bytes,然后,就可以把這個(gè)bytes寫入文件?;蛘哂昧硪粋€(gè)方法pickle.dump()直接把對(duì)象序列化后寫入一個(gè)file-like Object:
>>> f = open('dump.txt', 'wb')
>>> pickle.dump(d, f)
>>> f.close()
看看寫入的dump.txt文件,一堆亂七八糟的內(nèi)容,這些都是Python保存的對(duì)象內(nèi)部信息。
當(dāng)我們要把對(duì)象從磁盤讀到內(nèi)存時(shí),可以先把內(nèi)容讀到一個(gè)bytes,然后用pickle.loads()方法反序列化出對(duì)象,也可以直接用pickle.load()方法從一個(gè)file-like Object中直接反序列化出對(duì)象。我們打開另一個(gè)Python命令行來(lái)反序列化剛才保存的對(duì)象:
>>> f = open('dump.txt', 'rb')
>>> d = pickle.load(f)
>>> f.close()
>>> d
{'age': 20, 'score': 88, 'name': 'Bob'}
變量的內(nèi)容又回來(lái)了!
當(dāng)然,這個(gè)變量和原來(lái)的變量是完全不相干的對(duì)象,它們只是內(nèi)容相同而已。
Pickle的問(wèn)題和所有其他編程語(yǔ)言特有的序列化問(wèn)題一樣,就是它只能用于Python,并且可能不同版本的Python彼此都不兼容,因此,只能用Pickle保存那些不重要的數(shù)據(jù),不能成功地反序列化也沒(méi)關(guān)系。
以上就是本篇文章所講述的所有內(nèi)容,這篇文章主要介紹了python序列化的相關(guān)知識(shí),希望你能借助資料從而理解上述所說(shuō)的內(nèi)容。希望我在這片文章所講述的內(nèi)容能夠?qū)δ阌兴鶐椭屇銓W(xué)習(xí)python更加輕松。
相關(guān)文章
pyCharm 實(shí)現(xiàn)關(guān)閉代碼檢查
這篇文章主要介紹了pyCharm 實(shí)現(xiàn)關(guān)閉代碼檢查,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06
Pycharm配置Qt Designer及Pyuic的實(shí)現(xiàn)方法
本文介紹了如何安裝Qt designer和Pyuic以及他們的基本用法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
Python中裝飾器兼容加括號(hào)和不加括號(hào)的寫法詳解
這篇文章主要給大家介紹了關(guān)于Python中裝飾器兼容加括號(hào)和不加括號(hào)寫法的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-07-07
OpenCV視頻流Python多線程處理方法詳細(xì)分析
為OpenCV是搞計(jì)算機(jī)視覺必須要掌握的基礎(chǔ),這篇文章主要給大家介紹了關(guān)于OpenCV視頻流多線程處理的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-11-11

