一、什么叫序列化
序列化是將對象狀態轉換為可保持或傳輸的格式的過程。與序列化相對的是反序列化,它將流轉換為對象。這兩個過程結合起來,可以輕松地存儲和傳輸數據。
二、序列化pickle模塊
pickle模塊是做什么用的
用來存取結構化數據。用於python特有的類型和python的數據類型間進行轉換。
pickle可以存儲的數據類型
①所有python支持的原生類型:布爾值,整數,浮點數,復數,字符串,字節,None;
②由任何原生類型組成的列表,元組,字典和集合;
③函數,類,類的實例。
pickle模塊中常用的方法
pickle提供四個功能:dumps,dump,loads,load
①pickle.dumps(obj[, protocol])
函數的功能:將obj對象序列化為string形式,而不是存入文件中(以字節對象形式返回封裝的對象,不需要寫入文件中)。
參數講解:
obj:想要序列化的obj對象。
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.'
②pickle.dump(obj, file, protocol=None,)
函數的功能:將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)
③pickle.loads(string)
函數的功能:反序列化。從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}
④pickle.load(file)
函數的功能: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}
三、序列化模塊json
json模塊是做什么用的
用來存取結構化數據。用於字符串和Python數據類型間進行轉換。
json可以存儲的數據類型
只能支持int\str\list\tuple\dict
json模塊中常用的方法
json提供四個功能:dumps,dump,loads,load
①字典轉成json串
文件里只能寫字符串,但可以把字典轉成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串轉成字典
# 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 vs pickle
Json:
優點:跨語言(不同語言間的數據傳遞可用json交接)、體積小
缺點:只能支持int\str\list\tuple\dict
Pickle:
優點:專為python設計,支持python所有的數據類型
缺點:只能在python中使用,存儲數據占空間大
五、load vs loads
load和loads都是實現“反序列化”,區別在於:
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
load針對文件句柄
如本地有一個json文件a.json則可以d=json.load(open('a.json'))
相應的,dump就是將內置類型序列化為json對象后寫入文件