(二十二)序列化-pickle,json
阿新 • • 發佈:2018-12-27
一、什麼是序列化
在我們儲存資料或者⽹絡傳輸資料的時候,需要對我們的物件進⾏處理。 把物件處理成⽅便儲存和傳輸的資料格式,這個過程叫序列化。不同的序列化,結果也不同,但是⽬的是⼀樣的,都是為了儲存和傳輸。
二、 pickle
pickle⽤起來很簡單,說⽩了, 就是把我們的python物件寫入到⽂件中的⼀種解決⽅案。但是寫入到⽂件的是bytes,所以這東⻄不是給⼈看的,是給機器看的。
import pickle class Cat: def __init__(self, name, age): self.name = name self.age = age def catchMouse(self): print(self.name, "抓⽼⿏") c = Cat("jerry", 18) bs = pickle.dumps(c) # 序列化⼀個物件. print(bs) # ⼀堆⼆進位制. 看不懂 cc = pickle.loads(bs) # 把⼆進位制反序列化成我們的物件 cc.catchMouse() # 貓依然是貓. 還可以抓⽼⿏
pickle中的dumps可以序列化⼀個物件. loads可以反序列化⼀個物件. 我們使⽤dump
還可以直接把⼀個物件寫入到⽂件中
# f = open("cat", mode="wb") # pickle.dump(c, f) # 寫⼊到⽂件中 # f.close() f = open("cat", mode="rb") cc = pickle.load(f) # 從⽂件中讀取物件 cc.catchMouse()
要是儲存多個物件呢,很簡單,裝list⾥,然後讀取和寫入都⽤list。
lst = [Cat("jerry", 19), Cat("tommy", 20), Cat("alpha", 21)] f = open("cat", mode="wb") pickle.dump(lst, f) f = open("cat", mode="rb") ll = pickle.load(f) for el in ll: el.catchMouse()
三、 json
終於到json了, json是我們前後端互動的樞紐。相當於程式設計界的普通話,⼤家溝通都⽤json。為什麼這樣呢? 因為json的語法格式可以完美的表⽰出⼀個物件,那什麼是json?json全稱javascript object notation,翻譯過來叫js物件簡譜,看看使用方法:
import json dic = {"a": "張三", "b": "李四", "c": "王五"} s = json.dumps(dic) # 把字典轉化成json字串 print(s) 結果: {"a": "\u5f20\u4e09", "b": "\u674e\u56db", "c": "\u738b\u4e94"}
結果很不友好啊,那如何處理中⽂呢? 在dumps的時候給出另⼀個引數ensure_ascii=False就可以了。
import json dic = {"a": "張三", "b": "李四", "c": "王五"} s = json.dumps(dic,ensure_ascii=False) # 把字典轉化成json字串 print(s) 執行後結果: {"a": "張三", "b": "李四", "c": "王五"}
上面是把字典轉為了字串,下面再轉回來:
import json s = '{"a": "張三", "b": "李四", "c": "王五"}' dic = json.loads(s) print(type(dic), dic) 結果: <class 'dict'> {'a': '張三', 'b': '李四', 'c': '王五'}
很簡單的就把資料轉過來了,兩個函式,dumps 和 loads 實現了互相的轉換。
同樣也可以從⽂件中讀取⼀個json:
dic = {"a": "張三", "b": "李四", "c": "王五"} f = open("test.json", mode="w", encoding="utf-8") json.dump(dic, f, ensure_ascii=False) # 把物件打散成json寫⼊到⽂件中 f.close()
同樣也可以從⽂件中讀取⼀個json:
f = open("test.json", mode="r", encoding="utf-8") dic = json.load(f) f.close() print(dic)