python建立数据库并序列化_python之数据的序列化
參考博客:http://www.cnblogs.com/yyds/p/6563608.html
數據的序列化功能表
json.dumps()
將python數據類型轉換為(json)字符串
json.loads()
將json字符串轉化為python數據類型
json.dump()
將python數據類型以json形式保存在本地磁盤
json.load()
將本地磁盤中的json數據轉化為python數據類型
pickle.dumps()
將python數據類型轉化為python特定的二進制格式
pickle.loads()
將特定的二進制格式轉化為python數據類型
pickle.dump()
將python數據類型以特定的二進制格式保存到磁盤
pickle.load()
將本地磁盤中python特定的二進制格式數據轉化為python數據類型
shelve.open()
以類型dict的形式將python數據類型保存到本地磁盤或讀取本地磁盤數據并轉化為python數據類型
一、序列化概論
每種編程語言都有各自的的數據類型,其中面向對象的編程語言還允許開發者自定義數據類型(如:自定義類),python也是一樣。
很多時候,我們需要把各種數據類型的數據通過網絡傳送給其它機器或客戶端,或者想把內層中的各種數據類型的數據保存到本地磁盤持久化。
而我們知道文件中存儲的都是字符串,因此就需要格式的轉化。
如果要將一個系統內的數據通過網絡傳輸給其它系統或客戶端,
我們通常都需要先把這些數據轉化為字符串或字節串,
而且需要規定一種統一的數據格式才能讓數據接收端正確解析并理解這些數據的含義。
XML是早期被廣泛使用的數據交換格式,而如今大家使用更多的數據交換格式是JSON(JavaScript Object Notation),
它是一種輕量級的數據交換格式。JSON相對于XML而言,更加簡單、易于閱讀和編寫,同時也易于機器解析和生成。
如果想把數據持久化到本地磁盤,這部分數據通常只是供系統內部使用,
因此數據轉換協議以及轉換后的數據格式也就不要求是標準、統一的,只要本系統內部能夠正確識別即可。
將對象轉換為可通過網絡傳輸或可以存儲到本地磁盤的數據格式的過程稱為序列化;反之,則稱為反序列化。
在python中有幾個內置的用于數據序列化的模塊。
模塊名稱
描述
提供的api
json
用于實現python數據類型與通用(json)字符串之間的轉換
dumps()、dump()、loads()、load()
pickle
用于實現python數據類型與python特定二進制格式之間的轉換
dumps()、loads()
shelve
專門用于將python數據類型的數據持久化到磁盤,shelve是一個類似dict的對象。
open()
二、json模塊
>>> importjson>>> data = {"name":"kebi","age":25}>>> in_json =json.dumps(data)>>> type(in_json) #序列化:將一個字典轉化為字符串
>>>in_json'{"name": "kebi", "age": 25}'
>>>json.loads(in_json)
{'name': 'kebi', 'age': 25}>>> out_json = json.loads(in_json) #反序列化:將一個字符串格式的字典轉化為字符串
>>>out_json
{'name': 'kebi', 'age': 25}>>>type(out_json) #字典格式
除此之外,json模塊還提供了兩個額外的方法允許我們直接將序列化后得到的json數據保存到文件中,以及直接讀取文件中的json數據進行反序列化操作。
>>> f = open('json_file','w')>>>data
{'name': 'kebi', 'age': 25}>>> json.dump(data,f) #dump方法接受一個文件句柄,直接將字典轉化為json字符串寫入文件
>>>f.close()
[root@7 tmp]#cat json_file
{"name": "kebi", "age": 25} #已經寫入
>>> f = open('json_file')>>> data2 = json.load(f) #load方法接受一個文件句柄,直接將文件中的json字符串轉化成數據結構返回。
>>>data2
{'name': 'kebi', 'age': 25}>>>type(data2) #返回的是列表
在進行數據格式轉換的時候,數據的類型會略有改動。
>>> json.dumps({'a':'str', 'c': True, 'e': 10, 'b': 11.1, 'd': None, 'f': [1, 2, 3], 'g':(4, 5, 6)})'{"a": "str", "c": true, "e": 10, "b": 11.1, "d": null, "f": [1, 2, 3], "g": [4, 5, 6]}'
由上可知,True變成true,列表和元祖都變成序列,None變為null等
>>> json.loads('{"a": "str", "c": true, "b": 11.1, "e": 10, "d": null, "g": [4, 5, 6], "f": [1, 2, 3]}')
{'c': True, 'e': 10, 'a': 'str', 'g': [4, 5, 6], 'd': None, 'f': [1, 2, 3], 'b': 11.1}
在反序列化的時候部分又會變回來。
三、pickle模塊
pickle模塊實現了用于對python對象結構進行序列化和反序列化的二進制協議。
>>> importpickle>>>data
{'name': 'kebi', 'age': 25}>>> str_data =pickle.dumps(data)>>>str_data
b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x04\x00\x00\x00kebiq\x02X\x03\x00\x00\x00ageq\x03K\x19u.'
>>> data3 =pickle.loads(str_data)>>>data3
{'name': 'kebi', 'age': 25}
pickle模塊和json模塊對比:
(1)JSON是一種文本序列化格式(它輸出的是unicode文件,大多數時候會被編碼為utf-8),而pickle是一個二進制序列化格式。json我們能夠讀懂,而pickle不行。
(2) JSON是與特定的編程語言無關,且它在python之外被廣泛使用,而pickle使用的數據格式是特定于python的。
(3)默認情況下,JSON只能表示python內建數據類型,pickle可以直接表示大量的python數據類型。
四、shelve模塊
shelve是一個簡單的數據存儲方案,類似于key-value數據庫,可以很方便的保存python對象,其內部是通過pickle協議來實現數據序列化。
>>> importshelve>>> f = shelve.open('shelve_file') #直接對文件句柄進行操作,就可以存入數據
>>> f['key'] = {'name': 'kebi', 'age': 25}>>>f.close()>>> importshelve>>> f1 = shelve.open('shelve_file') #取出數據的時候也只需直接用key獲取即可,但是如果key不存在就會報錯。
>>> existing = f1['key']>>>f1.close()>>>existing
{'name': 'kebi', 'age': 25}
總結:
(1)各自優缺點
json模塊常用于編寫web接口,將python數據轉化為通用的json格式傳遞給其它系統或客戶端;
也可以用于將python數據保存到本地文件中,缺點是明文保存,保密性差。
pickle模塊和shelve模塊由于使用其特有的序列化協議,其序列化之后的數據只能被python識別,因此只能用于系統內部。
同時python2和python3默認使用的序列協議也不同,需要兼容的話還需要指定協議的版本。
pickle模塊和shelve模塊相對于json來說,對于自定義數據類型可以直接序列化和反序列化,不需要編寫額外的轉換函數或類。
shelve模塊可以看作是pickle模塊的升級版,因為shelve使用的就是pickle的序列化協議,
但是shelve比pickle提供的操作方式更加簡單、方便。
shelve模塊相對于其它兩個模塊在將python數據持久化到本地磁盤時有一個很明顯的優點就是,
它允許我們可以像操作dict一樣操作被序列化的數據,而不必一次性的保存或讀取所有的數據。
(2)適用場景
在與外部系統交接互用時用json模塊。
需要將少量、簡單python數據持久化到本地磁盤文件時可以考慮用pickle模塊。
需要將大量python數據化持久到本地磁盤文件或需要一些簡單的類似數據庫的增刪改查功能時,可以考慮用shelve模塊。
總結
以上是生活随笔為你收集整理的python建立数据库并序列化_python之数据的序列化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 经济学中的定量分析python_(转)P
- 下一篇: xp系统图标大全_XP、Win7一键清理