前言
python序列化:
把不能夠直接儲存的數據變爲可儲存,這個過程叫序列化。
反序列化:
把存儲的數據轉化爲原數據類型,這個過程叫反序列化。
encode() 和 decode() 的侷限性
在python基礎函數中,對數據的保存需要將字符串轉化爲字節流才能保存到文件中。
encode()
將字符串轉化爲字節流,decode()
將字節流轉化爲字符串,但都只侷限於對字符串進行轉化。
res_b = '我愛你'.encode('utf-8')
print(res_b, type(res_b))
res = res_b.decode('utf-8')
print(res, type(res))
# 結果:
# b'\xe6\x88\x91\xe7\x88\xb1\xe4\xbd\xa0' <class 'bytes'>
# 我愛你 <class 'str'>
如果對字符串以外的數據類型調用encode()
和decode()
,則報錯。
lst = ['我', '愛', '你']
res = lst.encode('utf-8')
# AttributeError: 'list' object has no attribute 'encode'
pickle模塊對數據轉換字節流的擴展
pickle
模塊解決了encode()
和decode()
的侷限性。
pickle
能將不同類型數據轉換爲字節流保存在文件中,並且讀取後能還原爲原數據類型,方便對數據的調用。
pickle.dumps(object)
和pickle.loads(byte)
:對數據進行操作。
import pickle
def func1():
print("我愛你")
# 對數據進行操作
res_b = pickle.dumps(func1) # 將數據轉換爲字節流
print(res_b, type(res_b))
res1 = pickle.loads(res_b) # 將字節流轉換回原數據
print(res1, type(res1))
# 結果
# b'\x80\x03c__main__\nfunc1\nq\x00.' <class 'bytes'>
# <function func1 at 0x000001A3E16F2EA0> <class 'function'>
pickle.dump(object, io)
和pickle.load(byte)
:與文件IO的交互操作
import pickle
def func1():
print("我愛你")
# 對文件進行操作
pickle.dump(func1, open('1.txt', 'wb+')) # 轉換數據後寫進IO流文件中
res2 = pickle.load(open('1.txt', 'rb+')) # 直接讀取IO流數據轉換爲原數據並返回
print(res2, type(res2))
# 結果
# <function func1 at 0x000001A3E16F2EA0> <class 'function'>
json庫對pickle模塊的擴展
json
是普遍遵守的文件傳輸格式,而且能將所有基本類型轉換爲字節流,並且能將字節流還原爲原數據類型,繼承了pickle
模塊所有功能的同時被大衆類似協議相互遵守使用。
import json