序列化相關
1. json
- 應用場景:
json模塊主要用於處理json格式的數據,可以將json格式的數據轉化為python的字典,便於python處理,同時也可以將python的字典或列表等對象轉化為json格式的數據,便於跨平台或跨語言進行數據交互
-
功能:
-
Json模塊提供了四個功能:dumps、dump、loads、load
-
Python 編碼為 JSON 類型轉換對應表:
Python JSON dict object list, tuple array str string int, float, int- & float-derived Enums number| True true False false None null - JSON 解碼為 Python 類型轉換對應表:
JSON Python object dict array list string str number (int) int number(real) float true True false False null None -
-
具體應用
- dumps 和 loads 用於python對象和字符串間的序列化和反序列化
dumps:將python 基本數據類型轉化為json格式數據類型
loads:將json格式數據類型轉化為python數據類型#!/usr/bin/env python # -*- coding: UTF-8 -*- #pyversion:python3.5 #owner:fuzj import json s1 = '{"key1":"value1"}' #字符串只能是這個格式的,才能被json轉換 通過loads進行反序列化時,必須使用雙引號 d1 = {'key2':'value2'} s2 = json.loads(s1) #使用loads反序列化 print('s1的內容:',s1) print("s1的類型:",type(s1)) print('s2的內容:',s2) print("s2的類型:",type(s2)) d2 = json.dumps(d1) print('d1的內容:',d1) print("d1的類型:",type(d1)) print('d2的內容:',d2) print("d2的類型",type(d2))
輸出結果: s1的內容: {"key1":"value1"} s1的類型: <class 'str'> s2的內容: {'key1': 'value1'} s2的類型: <class 'dict'> #經loads處理之后,str變味dict d1的內容: {'key2': 'value2'} d1的類型: <class 'dict'> d2的內容: {"key2": "value2"} d2的類型 <class 'str'> #經dumps處理之后,dict變為str- dump 和load 用於對文件進行序列化和反序列化
dump:主要用於json文件的讀寫,json.dump(x,f),x是對象,f是一個文件對象,這個方法可以將json字符串寫入到文本文件中
load:加載json文件``` #!/usr/bin/env python # -*- coding: UTF-8 -*- #pyversion:python3.5 #owner:fuzj import json s1 = '{"key1":"value1"}' #字符串只能是這個格式的,才能被json轉換 通過loads進行反序列化時,必須使用雙引號 d1 = {'key2':'value2'} json.dump(d1,open('序列化.txt','w')) #將s1序列化,並寫入文件 e1 = json.load(open('序列化.txt','r')) #讀取json文件 print("e1的類型:",type(e1)) print('e1的內容:',e1) ``` 輸出結果: e1的類型: <class 'dict'> e1的內容: {'key2': 'value2'}
2. pickle
- 應用場景
pickle模塊實現了基本的數據序列和反序列化,和json的功能類似。
通過pickle模塊的序列化操作我們能夠將程序中運行的對象信息保存到文件中去,永久存儲,也可以簡單的將字符進行序列化
通過pickle模塊的反序列化操作,我們能夠從文件中創建上一次程序保存的對象,也可以將字符進行反序列化。和json不同的是:json 更適合跨語言 可以處理字符串,基本數據類型;pickle python專有,更適合處理復雜類型的序列化
-
功能
pikle模塊提供 dumps loads dump load四個基本功能 -
具體應用
- dumps 和loads 用於python對象和字符串間的序列化和反序列化
dumps 和json.dumps功能一樣,但是以字節對象形式返回封裝的對象
loads和json.loads功能一樣,從字節對象中讀取被封裝的對象,並返回#!/usr/bin/env python # -*- coding: UTF-8 -*- #pyversion:python3.5 #owner:fuzj import pickle s1 = '{"key1":"value1"}' #字符串只能是這個格式的,才能被json轉換 通過loads進行反序列化時,必須使用雙引號 d1 = {'key2':'value2'} s3 = pickle.dumps(s1) print('s1的內容:',s1) print("s1的類型:",type(s1)) print('s3的內容:',s3) print("s3的類型:",type(s3)) d3 = pickle.loads(s3) print('d1的內容:',d1) print("d1的類型:",type(d1)) print('d3的內容:',d3) print("d3的類型",type(d3)) 輸出結果: s1的內容: {"key1":"value1"} s1的類型: <class 'str'> s3的內容: b'\x80\x03X\x11\x00\x00\x00{"key1":"value1"}q\x00.' s3的類型: <class 'bytes'> #dumps處理之后返回的是字節類型 d1的內容: {'key2': 'value2'} d1的類型: <class 'dict'> d3的內容: {"key1":"value1"} d3的類型 <class 'str'>
-
dump 和load 用於對文件進行序列化和反序列化.python數據持久化用的比較多
-
pickle.dump(obj, file, [,protocol])
注解:將對象obj保存到文件file中去。
protocol為序列化使用的協議版本,0:ASCII協議,所序列化的對象使用可打印的ASCII碼表示;1:老式的二進制協議;2:2.3版本引入的新二進制協議,較以前的更高效。其中協議0和1兼容老版本的python。protocol默認值為0。
file:對象保存到的類文件對象。file必須有write()接口, file可以是一個以'w'方式打開的文件或者一個StringIO對象或者其他任何實現write()接口的對象。如果protocol>=1,文件對象需要是二進制模式打開的。 -
pickle.load(file)
注解:從file中讀取一個字符串,並將它重構為原來的python對象。
file:類文件對象,有read()和readline()接口
-
#!/usr/bin/env python # -*- coding: UTF-8 -*- #pyversion:python3.5 #owner:fuzj import json import pickle s1 = '{"key1":"value1"}' #字符串只能是這個格式的,才能被json轉換 通過loads進行反序列化時,必須使用雙引號 d1 = {'key2':'value2'} pickle.dump(s1,open('序列化.txt','wb')) #注意需使用二進制方式寫入文件 e2 = pickle.load(open('序列化.txt','rb')) #需使用二進制方式讀取文件 print("e2的類型:",type(e2)) print('e2的內容:',e2) 輸出結果: e2的類型: <class 'str'> e2的內容: {"key1":"value1"}
