1. 程式人生 > >序列化(json,shelve)

序列化(json,shelve)

 

 


比如,我們在python程式碼中計算的一個數據需要給另外一段程式使用,那我們怎麼給? 現在我們能想到的方法就是存在檔案裡,然後另一個python程式再從檔案裡讀出來。 但是我們都知道,對於檔案來說是沒有字典這個概念的,所以我們只能將資料轉換成字典放到檔案中。 你一定會問,將字典轉換成一個字串很簡單,就是str(dic)就可以辦到了,為什麼我們還要學習序列化模組呢? 沒錯序列化的過程就是從dic 變成str(dic)的過程。現在你可以通過str(dic),將一個名為dic的字典轉換成一個字串, 但是你要怎麼把一個字串轉換成字典呢? 聰明的你肯定想到了eval(),如果我們將一個字串型別的字典str_dic傳給eval,就會得到一個返回的字典型別了。 eval()函式十分強大,但是eval是做什麼的?e官方demo解釋為:將字串str當成有效的表示式來求值並返回計算結果。 BUT!強大的函式有代價。安全性是其最大的缺點。 想象一下,如果我們從檔案中讀出的不是一個數據結構,而是一句"刪除檔案"類似的破壞性語句,那麼後果實在不堪設設想。 而使用eval就要擔這個風險。 所以,我們並不推薦用eval方法來進行反序列化操作(將str轉換成python中的資料結構) 為什麼要有序列化模組

序列化的目的

1、以某種儲存形式使自定義物件持久化

2、將物件從一個地方傳遞到另一個地方。 3、使程式更具維護性。

json

Json模組提供了四個功能:dumps、dump、loads、load

 

import json
dic = {'k1':'v1','k2':'v2','k3':'v3'}
str_dic = json.dumps(dic)  #序列化:將一個字典轉換成一個字串
print(type(str_dic),str_dic)  #<class 'str'> {"k3": "v3", "k1": "v1", "k2": "v2"}
#注意,json轉換完的字串型別的字典中的字串是由""表示的 dic2 = json.loads(str_dic)  #反序列化:將一個字串格式的字典轉換成一個字典
#注意,要用json的loads功能處理的字串型別的字典中的字串必須由""表示
print(type(dic2),dic2)  #<class 'dict'> {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}
list_dic = [1,['a','b','c'],3,{'k1':'v1','k2':'v2'}]
str_dic = json.dumps(list_dic) #也可以處理巢狀的資料型別
print(type(str_dic),str_dic) #<class 'str'> [1, ["a", "b", "c"], 3, {"k1": "v1", "k2": "v2"}]
list_dic2 = json.loads(str_dic)
print(type(list_dic2),list_dic2) #<class 'list'> [1, ['a', 'b', 'c'], 3, {'k1': 'v1', 'k2': 'v2'}] loads和dumps  
importjsonf=open('json_file','w')dic={'k1':'v1','k2':'v2','k3':'v3'}json.dump(dic,f)#dump方法接收一個檔案控制代碼,直接將字典轉換成json字串寫入檔案f.close()f=open('json_file')dic2=json.load(f)#load方法接收一個檔案控制代碼,直接將檔案中的json字串轉換成資料結構返回f.close()print(type(dic2),dic2)load和dump
load&dump

 

 ensure_ascii=False關鍵字使用

import json
f = open('file','w')
json.dump({'國籍':'中國'},f)
ret = json.dumps({'國籍':'中國'})
f.write(ret+'\n')
json.dump({'國籍':'美國'},f,ensure_ascii=False)
ret = json.dumps({'國籍':'美國'},ensure_ascii=False)
f.write(ret+'\n')
f.close() ensure_ascii關鍵字引數