python序列化物件和反序列化
阿新 • • 發佈:2020-02-15
1.首先不管哪種語言都會用到序列化和反序列化的過程,
2.序列化:把物件轉換為位元組序列的過程稱為物件的序列化; 反序列化:把物件轉換為位元組序列的過程稱為物件的序列化。
3.序列化的作用:把物件(變數)從記憶體中變成可儲存或傳輸的二進位制物件,序列化之後的內容就可以寫入磁碟,或者通過網路傳輸到別的機器上,同理,反序列化實現,把變數內容從序列化的物件重新讀取到記憶體
4.如何實現序列化?比如我們要在不同的程式語言之間傳遞物件,就必須把物件序列化為標準格式,例如xml,json。
json是標準的JavaScript語言的物件,其實就是字串,可以被所有語言讀取,也可以方便的儲存到磁碟或者網路傳輸。
5.JSON和Python的關係?兩者內建的資料型別對應關係如下
6.在python中json只能轉換一部分物件。類,函式無法轉換,就要用到pickle,但pickle只適用在python內部適用,shelve模組也是python內部使用
舉例說明
1.想要把一個列表寫進檔案
import json mq=[1,'e','r','m',4] with open('json_te','w') as fm: json.dump(mq,fm)
如下,不呼叫dumps序列化,則直接報錯,write()的引數必須是str型別
import json mq=[1,'e','r','m',4] #mq=json.dumps(mq) with open('json_te','w') as fm: fm.write(mq) #TypeError: write() argument must be str, not list
修改以上程式碼:執行成功
import json mq=[1,'e','r','m',4] mq=json.dumps(mq) with open('json_te','w') as fm: fm.write(mq)
2.以上程式碼還可以用dump替代,體現了dump和dumps之間的區別
import json mq=[1,'e','r','m',4] with open('json_te','w') as fm: json.dump(mq,fm)
3.對於從檔案中讀取該列表就體現了,反序列化的過程,如下過程,直接讀取出來的是str,程式把檔案內容作為一個長的字串
import json with open ('json_te','r') as fn: con=fn.read() print(type(con)) #<class 'str'> print(con[2]) #'
4.以下對比,反序列化處理的結果
import json with open ('json_te','r') as fn: con=fn.read() con=json.loads(con) print(type(con)) #<class 'list'> print(con[2]) # r
5.反序列化的另一種表達方式
import json with open ('json_te','r') as fn: con=json.load(fn) print(type(con)) #<class 'list'>
6.json的dumps和loads,不能處理像函式/類,這就需要用到pickle
import json def addmd(a,b): return int(a)+int(b) with open('pick_te','w') as fa: json.dump(fa,addmd) #TypeError: <_io.TextIOWrapper name='pick_te' mode='w' encoding='cp936'> is not JSON serializable
對比以下用pickle實現
import pickle def addmd(): return 1+1 addmd=pickle.dumps(addmd) with open('pick_te','wb') as fa: fa.write(addmd
7.還有一個shelve模組,只有包含一個open函式,返回像字典一樣的物件,直接實現檔案中內容的修改新增,比JSON方便但是其他語言不通用。
import shelve md=shelve.open('dict_t') md['name']='xiaohong ' print(md['name']) #xiaohong