1. 程式人生 > >python序列化資料模組

python序列化資料模組

一 什麼是序列化

序列化指的是將記憶體中的資料結構轉化為一種中間格式,並存儲到硬碟上。

(反序列化:將硬碟上儲存的中間格式資料再還原為記憶體中的資料結構)

二 為什麼要序列化

  1. 持久保持狀態

需知一個軟體/程式的執行就是處理一系列狀態的變化,在程式語言中,‘狀態‘會以各種有結構的資料型別(也可以稱之為變數)的形式儲存在記憶體中。

記憶體是無法永久儲存資料的,當程式運行了一段時間,我們斷電或者重啟程式,記憶體中關於這個程式之前一段時間的資料都會被清空。

在斷電或重啟程式之前將程式當前執行的資料儲存下來,便於下次程式執行能夠從檔案中載入之前的資料,然後繼續執行,這就是序列化。

  1. 資料跨平臺互動

序列化資料之後,不僅可以把序列化後的內容寫入硬碟,還可以通過網路傳輸到別的機器上,如果收發的雙方約定都使用一種序列化的格式,那麼便打破了平臺和語言帶來的限制,實現了跨平臺互動。

反過來,把變數內從從序列化的物件重新讀到記憶體裡稱之為反序列化,即unpicking。

三 序列化資料的三個模組

一 pickle模組

pickle模組時python內建的用來序列化python資料格式的模組,支援序列化python中所有的資料型別,主要方法有四個;

  1. 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)
  1. loads
import pickle
with open('userinfo.pkl', 'rb') as f:
    userbytes = f.read()
    user = pickle.loads(userbytes)
    print(user)

與dumps和loads對應的兩個方法更簡單。

  1. dump
import pickle
with open('userinfo.pkl', 'ab') as f:
    pickle.dump(user, f)
  1. 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格式資料的需求。

  1. json語法
js 中的資料型別  python資料型別 的對應關係
{}              字典
[]              list
string ""       str
int/float       int/float
true/false      True/False
null            None
  1. json格式的語法規範

最外層通常是一個字典或列表

{}or[],如果想定義json格式的資料,那麼最外層直接寫{},而且json中的字串必須是雙引號,json理論上可以巢狀任意多的層次。

2 為什麼用json

雖然之前的pickle和shelve都很強大,而且使用也非常方便,那麼為什麼還出來json呢?這是因為pickle和shevle序列化之後的資料只有python才能解析出來,而通常在實際生產開發中,都是需要資料可以跨平臺使用的。

3 json的使用

json模組的核心方法

  • dump
  • dumps
  • load
  • loads

不帶s的直接封裝了write和read方法。

  1. 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)
  1. 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))
  1. load
import json
with open('a.json', 'rt', encoding='utf-8') as f:
    print(json.load(f))
  1. loads
import json
with open('a.json', 'rt', encoding='utf-8') as f:
    res = json.loads(f.read())
    print(res)