Python之資料序列化(json、pickle、shelve)詳解
什麼是序列化
什麼是序列化,把程式中的物件或者變數,從記憶體中轉換為可儲存或可傳輸的過程稱為序列化。在 Python 中,這個過程稱為 pickling,在其他語言中也被稱為 serialization,marshalling,flattening 等。程式中的物件(或者變數)在序列化之後,就可以直接存放到儲存裝置上,或者直接傳送到網路上進行傳輸。
序列化的逆向過程,即為反序列化(unpickling),就是把序列化的物件(或者變數)重新讀到記憶體中~
Python中序列化的模組
模組名稱 | 描述 | 提供的api |
---|---|---|
json | 用於實現Python資料型別與通用(json)字串之間的轉換 | dumps()、dump()、loads()、load() |
pickle | 用於實現Python資料型別與Python特定二進位制格式之間的轉換 | dumps()、dump()、loads()、load() |
shelve | 專門用於將Python資料型別的資料持久化到磁碟,shelve是一個類似dict的物件,操作十分便捷 | open() |
json模組
大部分程式語言都會提供處理json資料的介面,Python 2.6開始加入了json模組,且把它作為一個內建模組提供,無需下載即可使用。
json支援的資料格式有限,有int str list dict以及特殊的tuple(會將tuple轉為list)
Json模組提供了四個功能:dumps、dump、loads、load
dumps和loads主要是在記憶體內操作,如下:
import json list = ['a','b','c'] list_str = json.dumps(list) print(list_str) #["a","b","c"] list2 = json.loads(list_str) print(list2) #['a','c']
而dump和load是從檔案內操作,如下:
import json list = ['a','c'] with open('test','w',encoding='utf-8') as f: json.dump(list,f) with open('test','r',encoding='utf-8') as f2: json.load(f2)
json模組中的字元編碼問題
在Python3中,程式碼中的字串都是使用 unicode 格式存放的,序列化之後也是以unicode 格式存放,所以序列化和反序列化過程都不存在問題。
Python2中,程式碼中的字串是 str型別,str型別 和 unicode型別 的關係如下所示:
unicode -----> encode --------> str(例如為 utf-8編碼)
utf-8(例如為 utf-8編碼) --------> decode ----------> unicode
所以在Python2中,序列化過程和反序列化過程都有涉及到轉碼過程(encode和decode),序列化過程 會先將物件中的字串 使用utf-8 進行解碼(decode),轉換為unicode型別後,再存放到檔案或者字串中,反序列化過程 會將 json字串 使用utf-8 編碼(encode),然後存放到記憶體中的變數~
pickle模組
用法與json類似,不過pickle不能跨語言,優點是它支援python所有的資料型別
需要注意的是,pickle是以bytes型別來進行序列化的
import pickle list = ['a','c'] list_str = pickle.dumps(list) print(list_str) #b'\x80\x03]q\x00(X\x01\x00\x00\x00aq\x01X\x01\x00\x00\x00bq\x02X\x01\x00\x00\x00cq\x03e.' list2 = pickle.loads(list_str) print(list2) #['a','c']
而正因為pickle是以bytes型別進行序列化的,所以在用dump和load方法對檔案進行寫入或者反序列化的時候,要以wb或者rb模式開啟,如下:
import pickle list = ['a','wb') as f: pickle.dump(list,'rb') as f2: pickle.load(f2)
shelve模組
shelve也是python提供給我們的序列化工具,比pickle用起來更簡單一些。 shelve只提供給我們一個open方法,是用key來訪問的,使用起來和字典類似。
import shelve f = shelve.open('test1') f['key'] = {'a':1,'b':2,'c':'sss'} #直接對檔案控制代碼操作,就可以存入資料 f['key2'] = {'d':3,'e':4,'f':'ddd'} f.close() f1 = shelve.open('test1') dic1 = f1['key'] #取出資料的時候也只需要直接用key獲取即可,但是如果key不存在會報錯 dic2 = f1['key2'] f1.close() print(dic1) print(dic2)
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。