關(guān)于如何把Python對象存儲(chǔ)為文件的方法詳解
加載和保存
pickle
中有兩組加載和保存函數(shù)
保存 | 加載 | |
---|---|---|
交互文件 | dump | load |
交互字節(jié)碼 | dumps | loads |
例如
x = [i**2 for i in range(10)] import pickle s = pickle.dumps(x) print(s) # b'\x80\x04\x95\x19\x00\x00\x00\x00\x00\x00\x00]\x94(K\x00K\x01K\x04K\tK\x10K\x19K$K1K@KQe.' with open("test.pickle", 'wb') as f: pickle.dump(x, f) # 將x存為f
將x
存儲(chǔ)為文件之后,還可以重新打開
with open("test.pickle", 'rb') as f: y = pickle.load(f) print(y) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
注意事項(xiàng)
除了不夠安全之外,使用pickle另外一個(gè)需要注意的是,到目前為止,pickle已經(jīng)有6個(gè)版本,其中v0和v1過于古老,基本沒什么能用的地方;v3以后的版本則不再支持Python2,下表列出了自v2到v5的一些更新特性
引入版本 | 文檔 | ||
---|---|---|---|
v2 | Python 2.3 | PEP307 | 為 新式類 提供了更高效的封存機(jī)制。 |
v3 | Python 3.0 | 顯式地支持字節(jié)對象 為Python 3.0-3.7 的默認(rèn)協(xié)議。 | |
v4 | Python 3.4 | PEP 3154 | 支持存儲(chǔ)較大對象,并針對數(shù)據(jù)格式進(jìn)行了優(yōu)化 Python 3.8使用的默認(rèn)協(xié)議。 |
v5 | Python 3.8 | PEP 574 | 增加對帶外數(shù)據(jù)的支持,并可加速帶內(nèi)數(shù)據(jù)處理 |
理論上講,pickle
可以封裝一切python對象,所以對于一些比較耗時(shí)的算法,可以通過pickle
來保存當(dāng)前的狀態(tài)。但要注意,盡管pickle
可以封存函數(shù),但并不能封存匿名函數(shù)
test = lambda x : x s = pickle.dumps(test) # 報(bào)錯(cuò) def test(x): print(x) s = pickle.dumps(test) print(s) #b'\x80\x04\x95\x15\x00\x00\x00\x00\x00\x00\x00\x8c\x08__main__\x94\x8c\x04test\x94\x93\x94.'
copyreg
python標(biāo)準(zhǔn)庫中還提供了copyreg模塊,可以注冊一個(gè)封存函數(shù),在對某個(gè)對象進(jìn)行封存時(shí)可調(diào)用。示例如下
import copyreg, pickle class C: def __init__(self, a): self.a = a def pickle_c(c): print("您封存了一個(gè)C對象") return C, (c.a,) copyreg.pickle(C, pickle_c) c = C(1) p = pickle.dumps(c) # 您封存了一個(gè)C對象
在通過copyreg.pickle對類型C注冊函數(shù)pickle_c之后,再去用pickle.dumps對c的對象進(jìn)行封存,就會(huì)調(diào)用pickle_c,從而打印出預(yù)設(shè)的字符串。
在copyreg.pickle中注冊的函數(shù),必須返回一個(gè)字符串或包含二至六個(gè)元素的元組。
命令行工具
python標(biāo)準(zhǔn)庫還提供了pickle的命令行工具,調(diào)用格式如下,其中x.pickle是一個(gè)封裝了python對象的二進(jìn)制文件。
python -m pickle x.pickle
常見的命令行選項(xiàng)如下表
指令 | 說明 | |
---|---|---|
-a | –annotate | 使用簡短的操作碼描述來標(biāo)注每一行。 |
-o | –output=<file> | 輸出應(yīng)當(dāng)寫入到的文件名稱。 |
-l | –indentlevel=<num> | 一個(gè)新的 MARK 層級(jí)所需縮進(jìn)的空格數(shù)。 |
-m | –memo | 當(dāng)反匯編多個(gè)對象時(shí),保留各個(gè)反匯編的備忘記錄。 |
-p | –preamble=<preamble> | 當(dāng)指定一個(gè)以上的 pickle 文件時(shí),在每次反匯編之前打印給定的前言。 |
以上就是關(guān)于如何把Python對象存儲(chǔ)為文件的方法詳解的詳細(xì)內(nèi)容,更多關(guān)于Python對象存儲(chǔ)為文件的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python 實(shí)現(xiàn)方陣的對角線遍歷示例
今天小編就為大家分享一篇python 實(shí)現(xiàn)方陣的對角線遍歷示例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-11-11使用seaborn繪制強(qiáng)化學(xué)習(xí)中的圖片問題
這篇文章主要介紹了使用seaborn繪制強(qiáng)化學(xué)習(xí)中的圖片問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01Python 實(shí)現(xiàn)將大圖切片成小圖,將小圖組合成大圖的例子
這篇文章主要介紹了Python 實(shí)現(xiàn)將大圖切片成小圖,將小圖組合成大圖的例子,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03簡要講解Python編程中線程的創(chuàng)建與鎖的使用
這篇文章主要介紹了簡要講解Python編程中線程的創(chuàng)建與鎖的使用,Python中雖然有GIL的存在,但依然是能夠創(chuàng)建多個(gè)線程來交替使用的,需要的朋友可以參考下2016-02-02Python實(shí)現(xiàn)從url中提取域名的幾種方法
這篇文章主要介紹了Python實(shí)現(xiàn)從url中提取域名的幾種方法,本文給出了3種方法實(shí)現(xiàn)在URL中提取域名的需求,需要的朋友可以參考下2014-09-09Python Tornado實(shí)現(xiàn)WEB服務(wù)器Socket服務(wù)器共存并實(shí)現(xiàn)交互的方法
這篇文章主要介紹了Python Tornado實(shí)現(xiàn)WEB服務(wù)器Socket服務(wù)器共存并實(shí)現(xiàn)交互的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05