1. 程式人生 > >day23 序列化模組

day23 序列化模組

概念:
  序列化 -- 其他資料型別轉換成一個字串資料型別
  反序列化 -- 字串轉換成其他資料型別
  序列 -- 字串

必須要轉換成字串的場景:
  往檔案裡面寫資料的時候只能寫字串,不能寫字典的
  網路傳輸的時候只能傳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()