【今日學習】
一、什麼是序列化?
我們把物件(變數)從記憶體中變成可儲存或傳輸的過程稱之為序列化,在python中叫pickling,在其他語言中也被稱之為serialization,marshalling,flattening等等,都是乙個意思。
二、為什麼要序列化?
1:持久儲存狀態【硬碟存】
需知乙個軟體/程式的執行就在處理一系列狀態的變化,在程式語言中,'狀態'會以各種各樣有結構的資料型別(也可簡單的理解為變數)的形式被儲存在記憶體中。
記憶體是無法永久儲存資料的,當程式執行了一段時間,我們斷電或者重啟程式,記憶體中關於這個程式的之前一段時間的資料(有結構)都被清空了。
在斷電或重啟程式之前將程式當前記憶體中所有的資料都儲存下來(儲存到檔案中),以便於下次程式執行能夠從檔案中載入之前的資料,然後繼續執行,這就是序列化。
具體的來說,你玩使命召喚闖到了第13關,你儲存遊戲狀態,關機走人,下次再玩,還能從上次的位置開始繼續闖關。或如,虛擬機器狀態的掛起等。
2:跨平台資料互動【網路傳】
序列化之後,不僅可以把序列化後的內容寫入磁碟,還可以通過網路傳輸到別的機器上,如果收發的雙方約定好實用一種序列化的格式,那麼便打破了平台/語言差異化帶來的限制,實現了跨平台資料互動。
反過來,把變數內容從序列化的物件重新讀到記憶體裡稱之為反序列化,即unpickling。
json模組【轉化成str型別】(優先掌握)
序列化與反序列化一:
json.dumps json.loads 是一對
序列化:
dic=
with open('db.json','w',encoding='utf-8') as f:
res = json.dumps(dic)
f.write(res)
print(res,type(res))結果
#json格式全都是雙引號,如果不是雙引號,反序列化json就識別不了
#乙個資料結構dump一次就行了,不要用『a.txt 』去新增
反序列化:
with open('db.json','r',encoding='utf-8') as f:data=f.read()
res=json.loads(data)
print(res)
結果序列化與反序列化二:
簡化版json.dump json.load 是一對
序列化import json
dic =
with open('db1.json','w',encoding='utf-8') as f:
json.dump(dic,f)
反序列化
import jsondic =
with open('db1.json','r',encoding='utf-8') as f:
print(json.load(f))
優點:資料跨平台較好
缺點:有些python資料型別不能識別,只能識別以下上資料型別
沒有元組和集合
pickle模組(了解)【轉化成bytes型別】
把所有的資料型別存成bytes型別,讀也需要用bytes型別去讀
優點:能識別所有python資料型別,能把所有資料型別序列化,用法與json類似
缺點:也是最致命缺點,只能識別python,跨平台較差
# 使用者註冊後得到的資料name = "高跟"
password = "123"
height = 1.5
hobby = ["吃","喝","賭","飄",]
# with open("userdb.txt","wt",encoding="utf-8") as f:
# text = "|".join([name,password,str(height)])
# f.write(text)
# pickle支援python中所有的資料型別
user =
# 序列化的過程
# with open("userdb.pkl","ab") as f:
# userbytes = pickle.dumps(user)
# f.write(userbytes)
# 反序列化過程
# with open("userdb.pkl","rb") as f:
# userbytes = f.read()
# user = pickle.loads(userbytes)
# print(user)
# print(type(user))
##dump 直接序列化到檔案
# with open("userdb.pkl","ab") as f:
# pickle.dump(user,f)
# #load 從檔案反序列化
with open("userdb.pkl","rb") as f:
user = pickle.load(f)
print(user)
shelve模組(了解)
也能像pickle序列化所有python資料型別,比pickle更方便
info1=info2=
import shelve
d=shelve.open('db.shv')
d['egon']=info1
d['run']=info2
d.close()
import shelve
d=shelve.open('db.shv')
# d['egon']
# d['run']
print(d['egon'])
print(d['run'])
import shelve
d=shelve.open('db.shv',writeback=true)
d['egon']['age']=20
d['run']['age']=18
print(d['egon'])
print(d['run'])
xml模組(了解)古老的用法也是將記憶體中資料儲存起來或傳輸出去,將資料組織起來importconfigparser# 取值# import configparser
# config=configparser.configparser()
# config.read('my.ini')
# secs=config.sections()
# print(secs)
# print(config.options('run'))
# # print(config.get('run','age'))
# print(config.getboolean('run','is_husband'))
# print(config.getfloat('run','salary'))
【今日領悟】1.json是最常用的序列化與反序列化模組,其它型別的模組常用部分熟悉就行2.需要在實際按例中去應用才能體會這幾個模組的不同
第二十一天
好久沒有寫點東西了。或許是為了忙個經濟師中級的考試,列印了很多的資料,每章一節一節地在消化,咀嚼著生硬的專業術語,那滋味,只有體會過了才知道。乙個晚上看下來,做夢也是這些內容,有點累,但是,為了目標,只有克服,努力前進。單位的專案要啟動了,事情特別多,給我們準備的時間就乙個禮拜,一開始拿到這個內容需...
PYTHON小白 第二十一天
python小白 第二十一天 1 使用raise引發異常 當程式出現錯誤時,系統會自動引發異常。除此之外,python允許程式自行引發異常,自行引發異常使用raise語句來完成。1.1 引發異常 很多時候,系統是否要引發異常,可能需要根據應用的業務需求來決定,如果程式中的資料 執行與既定的業務需求不...
第二十一天總結
今天學習了c 中的函式,感覺好難看懂,跟數學含糊一樣難,函式是一組一起執行乙個任務的語句。每個 c 程式都至少有乙個函式,即主函式 main 所有簡單的程式都可以定義其他額外 的函式。您可以把 劃分到不同的函式中。如何劃分 到不同的函式中是由您來決定的,但在邏輯上,劃分通常是根據每個函式執行乙個特定...