1. 程式人生 > >(二十二)序列化-pickle,json

(二十二)序列化-pickle,json

一、什麼是序列化

 在我們儲存資料或者⽹絡傳輸資料的時候需要對我們的物件進⾏處理把物件處理成⽅便儲存和傳輸的資料格式這個過程叫序列化不同的序列化結果也不同但是⽬的是⼀樣的都是為了儲存和傳輸

二、 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)