day23 序列化模組
阿新 • • 發佈:2018-11-06
概念:
序列化 -- 其他資料型別轉換成一個字串資料型別
反序列化 -- 字串轉換成其他資料型別
序列 -- 字串
必須要轉換成字串的場景:
往檔案裡面寫資料的時候只能寫字串,不能寫字典的
網路傳輸的時候只能傳bytes,字典也不能直接轉換成bytes
可以用到的模組:
json 非常重要的一個模組,非常非常
通用的序列化格式,不僅僅是侷限於python,優點就是很通用
只有很少的一部分資料型別可以序列化,侷限性比較大
pickle 僅次於json
所有的python的資料都可以序列化
問題在於,pickle序列化的內容只有python可以理解
而且,反序列化依賴程式碼本地存在,不存在則無法解析
shelve python3 裡面新加的,特點是好操作,但是實用性就一般
有個序列化控制代碼,很方便使用讀寫直接操作
新加的,存在一些小問題
json '{""}' json
可轉:
數字 字串 列表 字典 元祖
不可轉:
集合
特殊改變:
會將字串改成雙引號,字典裡面的單引號就會改成雙
元祖的序列化會被變成列表,本身是元祖的序列後再反序列化便不會來元祖就變成列表了
直接寫記憶體裡面的操作
序列化方法:dumps
反序列化方法:loads
1 import json 2 dic = {"k1":"v1"} 3 print(type(dic),dic) # <class 'dict'> {'k1': 'v1'} 4 strd = json.dumps(dic)5 print(type(strd),strd) # <class 'str'> {"k1": "v1"} 6 dicd = json.loads(strd) 7 print(type(dicd),dicd) # <class 'dict'> {'k1': 'v1'}
往檔案裡面寫的操作
一次性寫進去一次性讀出來
要不每次寫一行,每次讀一行,不然會報錯
1 # dump 往檔案裡面寫 2 import json 3 dic = {"k1":"v1"} 4 f = open("fff","w",encoding="utf-8") 5 json.dump(dic,f) 6 f.close() 7 8 # load 從檔案讀 9 f = open("fff") 10 res = json.load(f) 11 f.close() 12 print(type(res),res)
pickle
用法同jons,提供dump,load,dumps,loads方法
但是pickle序列化後會變成tyles型別,無法看出來源內容但是不影響你其他操作
因為是bytes型別,因此檔案操作需要用wb,rb的型別進行操作
pickle可以做任何任何資料型別,可以對集合進行序列化反序列化
比jons還要有一點,他可以分別dump load的
1 # shelve 只提供一個open方法,通過key可以寫入或者獲取到內容 2 import shelve 3 f = shelve.open("shelve_file") 4 f["key"] = {"int":10,"float":9.5,"string":"sda"} 5 f.close() 6 7 import shelve 8 f1 = shelve.open("shelve_file") 9 exiting = f1["key"] 10 f1.close() 11 print(exiting) 12 13 # writeback 不設定的話是沒辦法修改檔案的 14 # 不設定無法感知到修改,但是設定這個會對執行造成一定的資源佔用和影響 15 import shelve 16 f1 = shelve.open('shelve_file') 17 print(f1['key']) 18 f1['key']['new_value'] = 'this was not here before' 19 f1.close() 20 21 f2 = shelve.open('shelve_file', writeback=True) 22 print(f2['key']) 23 f2['key']['new_value'] = 'this was not here before' 24 f2.close()