【遊記】NOI Online 2022
api介面開發,最核心最常見的一個過程就說序列化,所謂序列化就說把資料轉換格式。
序列化:
把我們語言識別的資料轉化成指定的格式提供給別人
反序列化:
把別人提供的資料轉換/還原成我們需要的格式
Django中的序列化和反序列化
序列化過程:
我們再Django中獲取到的資料預設是模型物件(qs物件),但是模型物件資料無法直接提供給前端或別的平臺使用,所以我們需要把資料進行序列化,變成字串或者json資料,提供給別人。
反序列化過程:
前端傳入到後端的資料是json格式的字串給到了後端,後端存到資料庫中,需要轉成python中的物件,把json格式字串轉成python物件存到資料庫的過程稱為反序列化
相關模組
模組名稱 | 描述 | 提供的api |
---|---|---|
json | 用於實現Python資料型別與通用(json)字串之間的轉換 | dumps()、dump()、loads()、load() |
pickle | 用於實現Python資料型別與Python特定二進位制格式之間的轉換 | dumps()、dump()、loads()、load() |
shelve | 專門用於將Python資料型別的資料持久化到磁碟,shelve是一個類似dict的物件,操作十分便捷 | open() |
json模組
1、Python的JSON模組 序列化與反序列化的過程分別叫做:encoding 和 decoding。
encoding:
decoding: 把JSON字串轉換成python物件
json模組的序列化和反序列化操作
# 序列化:將Python物件轉換成json字串 dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw) # 反序列化:將json字串轉換成Python物件 loads(s, encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
序列化後得到的json資料儲存到檔案中,以及直接讀取檔案中的json資料進行反序列化操作:
# 序列化:將Python物件轉換成json字串並存儲到檔案中 dump(obj, fp, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw) # 反序列化:讀取指定檔案中的json字串並轉換成Python物件 load(fp, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
2、JSON與Python之間資料型別對應關係
Python轉JSON
Python | JSON |
---|---|
dict | Object |
list, tuple | array |
str | string |
int, float, int- & float-derived Enums | numbers |
True | true |
False | false |
None | null |
JSON轉python
JSON | Python |
---|---|
object | dict |
array | list |
string | str |
number(int) | int |
number(real) | float |
true | True |
false | False |
null | None |
pickle模組
pickle模組實現了用於對Python物件結構進行 序列化 和 反序列化 的二進位制協議,pickle模組序列化和反序列化的過程分別叫做 pickling 和 unpickling:
pickling: 是將Python物件轉換為位元組流的過程;
unpickling: 是將位元組流二進位制檔案或位元組物件轉換回Python物件的過程;
1、pickle模組與json模組對比
JSON是一種文字序列化格式(它輸出的是unicode檔案,大多數時候會被編碼為utf-8),而pickle是一個二進位制序列化格式;
JOSN是我們可以讀懂的資料格式,而pickle是二進位制格式,我們無法讀懂;
JSON是與特定的程式語言或系統無關的,且它在Python生態系統之外被廣泛使用,而pickle使用的資料格式是特定於Python的;
預設情況下,JSON只能表示Python內建資料型別,對於自定義資料型別需要一些額外的工作來完成;pickle可以直接表示大量的Python資料型別,包括自定資料型別(其中,許多是通過巧妙地使用Python內省功能自動實現的;複雜的情況可以通過實現specific object API來解決)
2、pickle模組使用的資料流格式
pickle使用的資料格式是特定於Python的。這使得它不受諸如JSON或XDR的外部標準限值,但是這也意味著非Python程式可能無法重建pickled Python物件。預設情況下,pickle資料格式使用相對緊湊的二進位制表示。如果需要最佳大小特徵,可以有效的壓縮pickled資料。pickletools模組包含可以用於對pickle生成的資料流進行分析的工具。目前有5種不同的協議可以用於pickle。使用的協議越高,就需要更新的Python版本去讀取pickle產生的資料:
協議v0是原始的“人類可讀”協議,並且向後相容早期的Python版本;
協議v1是一箇舊的二進位制格式,也與早期版本的Python相容;
協議v2在Python 2.3中引入,它提供更高效的pickling;
協議v3是在Python 3.0新增的協議,它明確支援bytes物件,且不能被Python 2.x 進行unpickle操作;這是預設協議,也是當需要相容其他Python 3版本時被推薦使用的協議;
協議4是在Python 3.4新增的協議,它添加了對極大物件的支援,pickling更多種類的物件,以及一些資料格式的優化。
3、pickle模組提供的相關函式
pickle模組提供的幾個序列化/反序列化的函式與json模組基本一致:
# 將指定的Python物件通過pickle序列化作為bytes物件返回,而不是將其寫入檔案 dumps(obj, protocol=None, *, fix_imports=True) # 將通過pickle序列化後得到的位元組物件進行反序列化,轉換為Python物件並返回 loads(bytes_object, *, fix_imports=True, encoding="ASCII", errors="strict") # 將指定的Python物件通過pickle序列化後寫入開啟的檔案物件中,等價於`Pickler(file, protocol).dump(obj)` dump(obj, file, protocol=None, *, fix_imports=True) # 從開啟的檔案物件中讀取pickled物件表現形式並返回通過pickle反序列化後得到的Python物件 load(file, *, fix_imports=True, encoding="ASCII", errors="strict")
說明: 上面這幾個方法引數中,*號後面的引數都是Python 3.x新增的,目的是為了相容Python 2.x,具體用法請參看官方文件。
shelve模組
shelve是一個簡單的資料儲存方案,類似key-value資料庫,可以很方便的儲存python物件,其內部是通過pickle協議來實現資料序列化。shelve只有一個open()函式,這個函式用於開啟指定的檔案(一個持久的字典),然後返回一個shelf物件。shelf是一種持久的、類似字典的物件。它與“dbm”的不同之處在於,其values值可以是任意基本Python物件--pickle模組可以處理的任何資料。這包括大多數類例項、遞迴資料型別和包含很多共享子物件的物件。keys還是普通的字串。
open(filename, flag='c', protocol=None, writeback=False)
flag 引數表示開啟資料儲存檔案的格式,可取值與dbm.open()
函式一致:
值 | 描述 |
---|---|
'r' | 以只讀模式開啟一個已經存在的資料儲存檔案 |
'w' | 以讀寫模式開啟一個已經存在的資料儲存檔案 |
'c' | 以讀寫模式開啟一個數據儲存檔案,如果不存在則建立 |
'n' | 總是建立一個新的、空資料儲存檔案,並以讀寫模式開啟 |
protocol 引數表示序列化資料所使用的協議版本,預設是pickle v3;
writeback 引數表示是否開啟回寫功能。
附錄
要實現的功能 | 可以使用的api |
---|---|
將Python資料型別轉換為(json)字串 | json.dumps() |
將json字串轉換為Python資料型別 | json.loads() |
將Python資料型別以json形式儲存到本地磁碟 | json.dump() |
將本地磁碟檔案中的json資料轉換為Python資料型別 | json.load() |
將Python資料型別轉換為Python特定的二進位制格式 | pickle.dumps() |
將Python特定的的二進位制格式資料轉換為Python資料型別 | pickle.loads() |
將Python資料型別以Python特定的二進位制格式儲存到本地磁碟 | pickle.dump() |
將本地磁碟檔案中的Python特定的二進位制格式資料轉換為Python資料型別 | pickle.load() |
以型別dict的形式將Python資料型別儲存到本地磁碟或讀取本地磁碟資料並轉換為資料型別 | shelve.open() |
詳情:https://www.cnblogs.com/yyds/p/6563608.html