json,pickle淺析,請指教

來源:互聯網
上載者:User

標籤:python_json   python_pickle   

JSON(JavaScript Object Notation)是一種輕量級的資料交換格式

由於檔案在記憶體中只能以二進位、字串的形式儲存。當儲存字典、函數的時候,就需要使用json序列化。json就好比是虛擬機器中的掛起,隨時開啟,隨時掛起。

一、儲存字典資料

1、json序列化資料

import jsoninfo = {‘age‘:22,‘name‘:‘peter‘,‘email‘:‘@qq.com‘}f = open(‘test.txt‘,‘w‘)    #開啟test.txt檔案,並寫入f.write(json.dumps(info))    #json.dumps對資料進行編碼,不負責寫入!print (json.dumps(info))    #列印json.dumps編碼後的資料f.close()

此時資料已經以字串的形式儲存在硬碟。如果只取出其中[age]的資料,下面的例子是無法提取資料的。

2、錯誤示範

f = open(‘test.txt‘,‘r‘)date = f.read()print (date[‘age‘])f.close()

原因分析:因為資料只能以字串、二進位的形式儲存,直接以字典的形式“date[age]”是絕對無法提取的。

3、json還原序列化資料  

import jsonf = open(‘test.txt‘,‘r‘)        #開啟test.txt檔案,並讀取date = json.loads(f.read())    #json.loads對資料進行解碼print (date[‘age‘])print (date[‘name‘])f.close()

經過json.loads解碼的資料將恢複成來源資料的樣式,可以直接輸出。

4、另一種簡單方法(eval()方法)

f.open(‘test.txt‘,‘r‘)date = eval(f.read())print (date([‘age‘]))f.close()

二、儲存函數(pickle)

json只能處理簡單的資料類型,例如:字典、列表等。無法處理函數。json在所有語言中都通用,可以用於不同語言之間互動。

pickle可以處理複雜的資料,使用方式和json一模一樣!pickle只適用於python

1、pickle序列化資料

import pickledef hello(name):    print (‘hello!‘,name)info = {        ‘age‘:22,‘name‘:‘peter‘,‘email‘:‘@qq.com‘,        ‘func‘:hello}    #函數hello的記憶體位址傳遞給func f = open(‘test1.py‘,‘wb‘)    #pickle.dumps()直接將資料轉寄為二進位儲存,因此需要用‘wb‘ print (pickle.dumps(info))    #列印pickle編碼後的資料 f.write(pickle.dumps(info))    #寫入編碼後資料 f.close()

析:pickle具有一套文法規則,編碼後的資料在檔案中是以一種類似“亂碼”的樣子儲存

2、pickle還原序列化(錯誤示範)

import picklef = open(‘test1.txt‘,‘rb‘)    #儲存的二進位,必須用‘re‘讀取date = pickle.loads(f.read())    print (date)

原因分析:此時是無法執行的。因為test1.txt中儲存了一個函數“hello”,當序列化的代碼執行完之後,函數“hello”的記憶體位址就會被釋放,因此字典info中‘func’就沒有值。

3、pickle還原序列化(正確示範)

import pickledef hello(name):    print (‘hello,hello!!‘,name)f = open(‘test1.txt‘,‘rb‘)date = pickle.loads(f.read())print (date[‘func‘])        #輸出記憶體位址print(date[‘func‘](‘peter‘))    #調用hello函數,輸出“hello,hello!!,peter”

由於之前函數被釋放,重新定義相同函數名字的函數即可。

三、小技巧

1、簡寫方式

f.write(json.dumps(info))json.loads(f.read())

   以上代碼可以簡寫為:

json.dump(info,f)json.load(f)

2、多次dump,一次load(3.0以上版本)

import jsoninfo = {‘age‘:22,‘name‘:‘peter‘,‘email‘:‘@qq.com‘}f = open(‘test.txt‘,‘w‘)json.dump(info,f)info[‘age‘]=‘33‘json.dump(info,f)info[‘name‘]=‘Tom‘json.dump(info,f)

結果會輸出三個字典,此時通過json.load(f)就會出錯!但是刻印通過for迴圈調用資料






疑問:1.pickle在處理函數時,具體是序列化整個函數,還是函數的記憶體位址

json,pickle淺析,請指教

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.