第二十一天 PYTHON學習

2022-05-15 15:33:11 字數 4110 閱讀 6701

【今日學習】

一、什麼是序列化?

我們把物件(變數)從記憶體中變成可儲存或傳輸的過程稱之為序列化,在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 json

dic =

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 所有簡單的程式都可以定義其他額外 的函式。您可以把 劃分到不同的函式中。如何劃分 到不同的函式中是由您來決定的,但在邏輯上,劃分通常是根據每個函式執行乙個特定...