序列化是將對象狀態轉換爲可保持或傳輸的格式的過程。與序列化相對的是反序列化,它將流轉換爲對象。這兩個過程結合起來,能夠輕鬆地存儲和傳輸數據。python
用來存取結構化數據。用於python特有的類型和python的數據類型間進行轉換。json
①全部python支持的原生類型:布爾值,整數,浮點數,複數,字符串,字節,None;
②由任何原生類型組成的列表,元組,字典和集合;
③函數,類,類的實例。數據結構
pickle提供四個功能:dumps,dump,loads,load函數
函數的功能:將obj對象序列化爲string形式,而不是存入文件中(以字節對象形式返回封裝的對象,不須要寫入文件中)。設計
參數講解:code
obj:想要序列化的obj對象。orm
protocal:若是該項省略,則默認爲0。若是爲負值或HIGHEST_PROTOCOL,則使用最高的協議版本。對象
# dumps功能 # dumps 將數據經過特殊的形式轉換爲只有python語言認識的字符串 import pickle info = { 'name': 'Vivian', 'age': 20, 'height': 157 } data = pickle.dumps(info) # dumps會把數據變成bytes形式 print(data) # 輸出 # b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x06\x00\x00\x00Vivianq\x02X\x03\x00\x00\x00ageq\x03K\x14X\x06\x00\x00\x00heightq\x04K\x9du.'
函數的功能:將obj對象序列化存入已經打開的file中。內存
參數講解:字符串
必填參數obj表示將要封裝的對象
必填參數file表示obj要寫入的文件對象,file必須以二進制可寫模式打開,即「wb」
注:一個字典a = {'name':'Tom','age':22},用pickle.dump存到本地文件,所存數據的結構就是字典,而普通的file.write寫入文件的是字符串。
# dump功能 # dump 將數據經過特殊的形式轉換爲只有python語言認識的字符串,並寫入文件 import pickle info = { 'name': 'Vivian', 'age': 20, 'height': 157 } with open('information.pkl', 'wb') as f: pickle.dump(info, f)
函數的功能:反序列化。從string中讀出序列化前的obj對象(從字節對象中讀取被封裝的對象,並返回)。
參數講解:
string:文件名稱。
# loads功能 # loads 將pickle數據轉換爲python的數據結構 import pickle info = { 'name': 'Vivian', 'age': 20, 'height': 157 } data1 = pickle.dumps(info) print(data1) data2 = pickle.loads(data1) print(data2) # 輸出 # b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x06\x00\x00\x00Vivianq\x02X\x03\x00\x00\x00ageq\x03K\x14X\x06\x00\x00\x00heightq\x04K\x9du.' # {'name': 'Vivian', 'age': 20, 'height': 157}
函數的功能:load對象反序列化,從文件讀取數據,將file中的對象序列化讀出。
參數講解:
file:文件名稱。必填參數file必須以二進制可讀模式打開,即「rb」,其餘都爲可選參數。
# load功能 # load 從數據文件中讀取數據,並轉換爲python的數據結構 import pickle with open('information.pkl', 'rb') as f: print(pickle.load(f)) # 輸出 # {'name': 'Vivian', 'age': 20, 'height': 157}
用來存取結構化數據。用於字符串和Python數據類型間進行轉換。
只能支持int\str\list\tuple\dict
json提供四個功能:dumps,dump,loads,load
文件裏只能寫字符串,但能夠把字典轉成json串,json串是字符串,能夠存到文件裏。
# json.dumps 將數據經過特殊的形式轉換位全部程序語言都認識的字符串 import json info = { 'name': 'Vivian', 'age': 20, 'height': 157 } j_str = json.dumps(info) # 注意json dumps生成的是字符串,不是bytes print(j_str) print(type(j_str)) # 輸出 # {"name": "Vivian", "age": 20, "height": 157} # <class 'str'>
# 使用.dump()方法前,要先打開文件,再寫入 with open('massage.json', 'w') as f: json.dump(info, f)
# json.loads 用於解碼 JSON 數據。該函數返回 Python 字段的數據類型 print(json.loads(j_str)) print(type(json.loads(j_str))) # 輸出 # {'name': 'Vivian', 'age': 20, 'height': 157} # <class 'dict'>
with open('massage.json') as f: data = json.load(f) print(data) print(type(data)) # {"name": "Vivian", "age": 20, "height": 157} # <class 'dict'>
Json:
優勢:跨語言(不一樣語言間的數據傳遞可用json交接)、體積小
缺點:只能支持int\str\list\tuple\dict
Pickle:
優勢:專爲python設計,支持python全部的數據類型
缺點:只能在python中使用,存儲數據佔空間大
load和loads都是實現「反序列化」,區別在於:
即將Python內置數據序列化爲字串。如使用json.dumps序列化的對象d_json=json.dumps({'a':1, 'b':2}),在這裏d_json是一個字串'{"b": 2, "a": 1}'
d=json.loads(d_json) #{ b": 2, "a": 1},使用load從新反序列化爲dict
如本地有一個json文件a.json則能夠d=json.load(open('a.json'))
相應的,dump就是將內置類型序列化爲json對象後寫入文件