Json & pickle 資料序列化

來源:互聯網
上載者:User

標籤:asc   log   ges   方式   列表   bsp   erro   寫法   closed   

前提:

文字檔中只能寫入字串或ascii碼格式的內容。

info={‘name‘:‘zoe‘,‘age‘:18}f=open(‘test.txt‘,‘w‘)f.write(info)  #在文字檔中寫入字典格式的內容,執行會報錯。f.closed()

變通方式將 f.write(info) 改為 f.write(str(info))。

但是這種寫法比較低端。

同時,將檔案通過open()讀取到環境中,讀取進來的還是字串格式的。上面的操作是序列化,讀取檔案後的操作時還原序列化。

f=open(‘test.txt‘,‘r‘)data=f.read()print(type(data))   #返回class ‘str‘#想要保留資料的原本的格式,還需要將資料轉化。data_new=eval(data)print(type(data_new))print(data_new)

返回:

 但是上面的序列化和還原序列化的方式不是常規的用法。只是在我們不瞭解序列化模組json,pickle的時候的用法。接下來我們介紹用於序列化的兩個模組。

 

用於序列化的兩個模組

  • json,用於字串 和 python資料類型間進行轉換
  • pickle,用於python特有的類型 和 python的資料類型間進行轉換

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

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

json

執行個體1:

import jsoninfo={‘name‘:‘zoe‘,‘age‘:18}f=open(‘test.txt‘,‘w‘)f.write(json.dumps(info))  #序列化。將info轉換為字串,寫入文字檔中f.close()
import jsonf=open(‘test.txt‘,‘r‘)data=json.loads(f.read())   #還原序列化。用loads方法將字串print(data(type))f.close()

執行個體2:

>>> import json>>> def sayhi(name):    print(‘hello,‘,name)    >>> info={‘name‘:‘zoe‘,‘age‘:18,‘func‘:sayhi}>>> f=open(‘test.txt‘,‘w‘)>>> f.write(json.dumps(info))   #函數sayhi的記憶體位址不是json可以序列化的參數。Traceback (most recent call last):  File "<pyshell#12>", line 1, in <module>    f.write(json.dumps(info))  File "C:\Users\Zoe\Anaconda3\lib\json\__init__.py", line 230, in dumps    return _default_encoder.encode(obj)  File "C:\Users\Zoe\Anaconda3\lib\json\encoder.py", line 198, in encode    chunks = self.iterencode(o, _one_shot=True)  File "C:\Users\Zoe\Anaconda3\lib\json\encoder.py", line 256, in iterencode    return _iterencode(o, 0)  File "C:\Users\Zoe\Anaconda3\lib\json\encoder.py", line 179, in default    raise TypeError(repr(o) + " is not JSON serializable")TypeError: <function sayhi at 0x000000000317F8C8> is not JSON serializable

所以,json只能支援簡單的資料類型,如字典,列表,字串等。——

json主要用於不同的語言之間進行資料互動。比方說java和python之間的字典的互動,類,函數等複雜的json是無法進行處理,在不同語言之間進行互動。

xml主要在不同的語言和程式之間進行資料互動,是一種標記式的語言,正在逐漸被json給取代。因為json更簡潔,更清晰。json是目前主流的在不同語言之間進行資料互動的模組。

 

json只能處理簡單的,而pickle是用來處理複雜的資料類型。

json和pickle的操作和json一模一樣。

pickle

 執行個體1:

import pickledef sayhi(name):    print(‘hello,‘,name)info={‘name‘:‘zoe‘,‘age‘:18,‘func‘:sayhi}f=open(‘test.txt‘,‘wb‘)  #以二進位方式寫入檔案f.write(pickle.dumps(info))   #pickle.dump(info,f)完全等價f.close()

 

還原序列化:

import pickledef sayhi(name):    print(‘hello world‘,name)f=open(‘test.txt‘,‘rb‘)a=pickle.loads(f.read())  #完全等價於pickle.load(f)print(a)a[‘func‘](‘zoe‘)   ‘‘‘如果還原序列化中程式中沒有sayhi()函數,則會報錯。然而,在程式中有定義的同名的sayhi()函數即可讀取並調用。兩個程式之間的記憶體位址是不能互相訪問的,所以在函數序列化中,pickle只能在python中使用。‘‘‘

 

 

小知識:

json和pickle在檔案寫入過程中dumps兩次,會寫入兩次;

json和pickle在檔案中loads,在3.x中只能loads一次。

在2.x中第一次dump的,可以第一次loads。但是這個不好。

所以對於同一個檔案的寫入和讀取記住只dump一次,load一次。如果想要每個都要dump一次,則dump成不同的檔案。

 

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.