python中的序列化——從pickle模塊到json模塊的擴展

前言

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章