基于jsp網(wǎng)站開發(fā)與實(shí)現(xiàn)和生活app下載安裝最新版
Python 常用模塊pickle
pickle序列化模塊
【一】定義
- 序列化:將數(shù)據(jù)結(jié)構(gòu)或?qū)ο?/strong>轉(zhuǎn)換為可存儲(chǔ)或傳輸?shù)母袷?/strong>
- 反序列化:將序列化后的數(shù)據(jù)恢復(fù)為開始的數(shù)據(jù)結(jié)構(gòu)或者對(duì)象
【二】目的
- 數(shù)據(jù)持久化存儲(chǔ)
- 遠(yuǎn)程通信
- 緩存
- 進(jìn)程間通信
【三】序列化
- 將對(duì)象轉(zhuǎn)換為字節(jié)流的過(guò)程稱為序列化
pickle.dumps(obj, protocol=None, *, fix_imports=True, buffer_callback=None)
pickle.dump(obj, file, protocol=None, *, fix_imports=True, buffer_callback=None)
obj
:要序列化的對(duì)象file
:一個(gè)文件對(duì)象,通常以二進(jìn)制寫入模式打開文件protocol
:序列化的版本號(hào),可以省略,默認(rèn)(None
)最高版本fix_imports
:為True
默認(rèn),嘗試自動(dòng)修復(fù)在不同Python
版本之間可能的模塊導(dǎo)入問(wèn)題buffer_callback
:一個(gè)可選的回調(diào)函數(shù),用于控制內(nèi)部緩沖區(qū)的分配。默認(rèn)使用內(nèi)部緩沖區(qū)管理
import pickleuser_dict = {"name": "bruce", "age": "18"}str_dict = pickle.dumps(user_dict)
print(str_dict)
print(type(str_dict))
# b'\x80\x04\x95\x1f\x00\x00\x00\x00\x00\x00\x00}\x94(\x8c\x04name\x94\x8c\x05bruce\x94\x8c\x03age\x94\x8c\x0218\x94u.'
# <class 'bytes'>
with open("a.pkl", "wb") as fp:pickle.dump(user_dict, fp)
# pickle.dump(user_dict, open("a.pkl", "wb"))
【四】反序列化
- 將字節(jié)流還原成對(duì)象的過(guò)程稱為反序列化
pickle.loads(data, *, fix_imports=True, encoding="ASCII", errors="strict"buffers=None)
pickle.load(file, *, fix_imports=True, encoding="ASCII", errors="strict",buffers=None)
data
:要序列化的字節(jié)流內(nèi)容file
:一個(gè)文件對(duì)象,通常以二進(jìn)制讀取模式打開文件fix_imports
:為True
默認(rèn),嘗試自動(dòng)修復(fù)在不同Python版本之間可能的模塊導(dǎo)入問(wèn)題encoding
:字符串編碼格式errors
:解碼錯(cuò)誤的處理方式,與str.decode()
方法中的參數(shù)相同。默認(rèn)strict,即拋出UnicodeDecodeError
buffers
:一個(gè)可選的PickleBuffer
對(duì)象,用于提供自定義緩沖區(qū)的支持,默認(rèn)None
import picklewith open("a.pkl", "rb") as fp:read_dict = pickle.load(fp)
# read_dict = pickle.load(open("a.pkl", "rb"))
print(read_dict)
print(type(read_dict))
# {'name': 'bruce', 'age': '18'}
# <class 'dict'>
【五】通用性
-
pickle
模塊適用于大多數(shù)Python
對(duì)象,包括自定義類的實(shí)例、內(nèi)置數(shù)據(jù)類型等。 -
不適用于某些特殊對(duì)象,比如文件句柄、數(shù)據(jù)庫(kù)連接等。
-
josn
序列化以后java
、js
等語(yǔ)言可以識(shí)別 -
pickle
序列化以后,其他語(yǔ)言都不能識(shí)別
【六】應(yīng)用
【1】函數(shù)寫入文件、從文件讀取函數(shù)
import pickledef my_func():print("這是定制函數(shù)")pickle.dump(my_func, open("a.pkl", "wb"))
read_func = pickle.load(open("a.pkl", "rb"))
read_func() # 這是定制函數(shù)
【2】將實(shí)例寫入文件、從文件讀取實(shí)例
import pickleclass PeaShooter:def __init__(self, name, attack_val):self.name = nameself.attack_val = attack_valpickle.dump(PeaShooter, open("a.pkl", "wb"))
read_object = pickle.load(open("a.pkl", "rb"))
ice_shooter = read_object("寒冰射手", 20)pickle.dump(ice_shooter, open("a.pkl", "wb"))
read_instance = pickle.load(open("a.pkl", "rb"))
print(read_instance.__dict__)
# {'name': '寒冰射手', 'attack_val': 20}