1. 程式人生 > 程式設計 >Python之資料序列化(json、pickle、shelve)詳解

Python之資料序列化(json、pickle、shelve)詳解

什麼是序列化

什麼是序列化,把程式中的物件或者變數,從記憶體中轉換為可儲存或可傳輸的過程稱為序列化。在 Python 中,這個過程稱為 pickling,在其他語言中也被稱為 serialization,marshalling,flattening 等。程式中的物件(或者變數)在序列化之後,就可以直接存放到儲存裝置上,或者直接傳送到網路上進行傳輸。

序列化的逆向過程,即為反序列化(unpickling),就是把序列化的物件(或者變數)重新讀到記憶體中~

Python中序列化的模組

模組名稱 描述 提供的api
json 用於實現Python資料型別與通用(json)字串之間的轉換 dumps()、dump()、loads()、load()
pickle 用於實現Python資料型別與Python特定二進位制格式之間的轉換 dumps()、dump()、loads()、load()
shelve 專門用於將Python資料型別的資料持久化到磁碟,shelve是一個類似dict的物件,操作十分便捷 open()

json模組

大部分程式語言都會提供處理json資料的介面,Python 2.6開始加入了json模組,且把它作為一個內建模組提供,無需下載即可使用。

json支援的資料格式有限,有int str list dict以及特殊的tuple(會將tuple轉為list)

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

dumps和loads主要是在記憶體內操作,如下:

import json 
 list = ['a','b','c'] 
 list_str = json.dumps(list)
 print(list_str)   #["a","b","c"] 
 list2 = json.loads(list_str)
 print(list2)    #['a','c']

而dump和load是從檔案內操作,如下:

import json
 list = ['a','c']
 with open('test','w',encoding='utf-8') as f:
   json.dump(list,f) 
 with open('test','r',encoding='utf-8') as f2:
   json.load(f2)

json模組中的字元編碼問題

在Python3中,程式碼中的字串都是使用 unicode 格式存放的,序列化之後也是以unicode 格式存放,所以序列化和反序列化過程都不存在問題。

Python2中,程式碼中的字串是 str型別,str型別 和 unicode型別 的關係如下所示:

unicode -----> encode --------> str(例如為 utf-8編碼)

utf-8(例如為 utf-8編碼) --------> decode ----------> unicode

所以在Python2中,序列化過程和反序列化過程都有涉及到轉碼過程(encode和decode),序列化過程 會先將物件中的字串 使用utf-8 進行解碼(decode),轉換為unicode型別後,再存放到檔案或者字串中,反序列化過程 會將 json字串 使用utf-8 編碼(encode),然後存放到記憶體中的變數~

pickle模組

用法與json類似,不過pickle不能跨語言,優點是它支援python所有的資料型別

需要注意的是,pickle是以bytes型別來進行序列化的

import pickle
 list = ['a','c']
 list_str = pickle.dumps(list)
 print(list_str)     #b'\x80\x03]q\x00(X\x01\x00\x00\x00aq\x01X\x01\x00\x00\x00bq\x02X\x01\x00\x00\x00cq\x03e.'
 
 list2 = pickle.loads(list_str)
 print(list2)      #['a','c']

而正因為pickle是以bytes型別進行序列化的,所以在用dump和load方法對檔案進行寫入或者反序列化的時候,要以wb或者rb模式開啟,如下:

import pickle
 list = ['a','wb') as f:
   pickle.dump(list,'rb') as f2:
   pickle.load(f2)

shelve模組

shelve也是python提供給我們的序列化工具,比pickle用起來更簡單一些。 shelve只提供給我們一個open方法,是用key來訪問的,使用起來和字典類似。

import shelve
 f = shelve.open('test1')
 f['key'] = {'a':1,'b':2,'c':'sss'} #直接對檔案控制代碼操作,就可以存入資料
 f['key2'] = {'d':3,'e':4,'f':'ddd'}
 f.close()
 f1 = shelve.open('test1')
 dic1 = f1['key'] #取出資料的時候也只需要直接用key獲取即可,但是如果key不存在會報錯
 dic2 = f1['key2']
 f1.close()
 print(dic1)
 print(dic2)

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。