python序列化資料模組
一 什麼是序列化
序列化指的是將記憶體中的資料結構轉化為一種中間格式,並存儲到硬碟上。
(反序列化:將硬碟上儲存的中間格式資料再還原為記憶體中的資料結構)
二 為什麼要序列化
- 持久保持狀態
需知一個軟體/程式的執行就是處理一系列狀態的變化,在程式語言中,‘狀態‘會以各種有結構的資料型別(也可以稱之為變數)的形式儲存在記憶體中。
記憶體是無法永久儲存資料的,當程式運行了一段時間,我們斷電或者重啟程式,記憶體中關於這個程式之前一段時間的資料都會被清空。
在斷電或重啟程式之前將程式當前執行的資料儲存下來,便於下次程式執行能夠從檔案中載入之前的資料,然後繼續執行,這就是序列化。
- 資料跨平臺互動
序列化資料之後,不僅可以把序列化後的內容寫入硬碟,還可以通過網路傳輸到別的機器上,如果收發的雙方約定都使用一種序列化的格式,那麼便打破了平臺和語言帶來的限制,實現了跨平臺互動。
反過來,把變數內從從序列化的物件重新讀到記憶體裡稱之為反序列化,即unpicking。
三 序列化資料的三個模組
一 pickle模組
pickle模組時python內建的用來序列化python資料格式的模組,支援序列化python中所有的資料型別,主要方法有四個;
- dumps
import pickle name = 'musibii' age = 18 height = 1.7 user = {'name': name, 'age': age, 'height': height} with open('userinfo.pkl', 'ab') as f: userbytes = pickle.dumps(user) f.write(userbytes)
- loads
import pickle
with open('userinfo.pkl', 'rb') as f:
userbytes = f.read()
user = pickle.loads(userbytes)
print(user)
與dumps和loads對應的兩個方法更簡單。
- dump
import pickle
with open('userinfo.pkl', 'ab') as f:
pickle.dump(user, f)
- load
import pickle with open('userinfo.pkl', 'rb') as f: user = pickle.load(f) print(user)
二 shelve模組
shevlve模組也用於序列化,它和pickle模組不同的地方在於,不需要關心檔案模式,直接把資料當成字典來看待。而且shelve模組可以直接對資料進行修改,而不用覆蓋之前的資料,但pickle要想修改的話只能使用wb模式覆蓋
shelve只有一個方法open,所以使用起來也很方便。同樣的,shelve也支援python中所有的資料格式。
import shelve
user = {'name': 'musibii'}
s = shelve.open('userdb.shv')
s['user'] = user
s.close()
三 json模組
1 json是什麼
JSON是Java script object notation的縮寫,翻譯過來就是js物件標識法。
對於開發者而言,json是一種通用的資料格式,任何語言都能解析,所以每種語言都會有處理json格式資料的需求。
- json語法
js 中的資料型別 python資料型別 的對應關係
{} 字典
[] list
string "" str
int/float int/float
true/false True/False
null None
- json格式的語法規範
最外層通常是一個字典或列表
{}or[],如果想定義json格式的資料,那麼最外層直接寫{},而且json中的字串必須是雙引號,json理論上可以巢狀任意多的層次。
2 為什麼用json
雖然之前的pickle和shelve都很強大,而且使用也非常方便,那麼為什麼還出來json呢?這是因為pickle和shevle序列化之後的資料只有python才能解析出來,而通常在實際生產開發中,都是需要資料可以跨平臺使用的。
3 json的使用
json模組的核心方法
- dump
- dumps
- load
- loads
不帶s的直接封裝了write和read方法。
- dump
import json
jsontext = """{
"users": [{
"name": "musibii",
"age": 18
},
{
"name": "thales",
"age": 23
}
]
}"""
with open('a.json', 'wt', encoding='utf-8') as f:
json.dump(jsontext, f)
- dumps
import json
jsontext = """{
"users": [{
"name": "musibii",
"age": 18
},
{
"name": "thales",
"age": 23
}
]
}"""
with open('a.json', 'wt', encoding='utf-8') as f:
f.write(json.dumps(jsontext))
- load
import json
with open('a.json', 'rt', encoding='utf-8') as f:
print(json.load(f))
- loads
import json
with open('a.json', 'rt', encoding='utf-8') as f:
res = json.loads(f.read())
print(res)