關(guān)于如何把Python對(duì)象存儲(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ǔ)為文件之后,還可以重新打開(kāi)
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過(guò)于古老,基本沒(méi)什么能用的地方;v3以后的版本則不再支持Python2,下表列出了自v2到v5的一些更新特性
| 引入版本 | 文檔 | ||
|---|---|---|---|
| v2 | Python 2.3 | PEP307 | 為 新式類 提供了更高效的封存機(jī)制。 |
| v3 | Python 3.0 | 顯式地支持字節(jié)對(duì)象 為Python 3.0-3.7 的默認(rèn)協(xié)議。 | |
| v4 | Python 3.4 | PEP 3154 | 支持存儲(chǔ)較大對(duì)象,并針對(duì)數(shù)據(jù)格式進(jìn)行了優(yōu)化 Python 3.8使用的默認(rèn)協(xié)議。 |
| v5 | Python 3.8 | PEP 574 | 增加對(duì)帶外數(shù)據(jù)的支持,并可加速帶內(nèi)數(shù)據(jù)處理 |
理論上講,pickle可以封裝一切python對(duì)象,所以對(duì)于一些比較耗時(shí)的算法,可以通過(guò)pickle來(lái)保存當(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)庫(kù)中還提供了copyreg模塊,可以注冊(cè)一個(gè)封存函數(shù),在對(duì)某個(gè)對(duì)象進(jìn)行封存時(shí)可調(diào)用。示例如下
import copyreg, pickle
class C:
def __init__(self, a):
self.a = a
def pickle_c(c):
print("您封存了一個(gè)C對(duì)象")
return C, (c.a,)
copyreg.pickle(C, pickle_c)
c = C(1)
p = pickle.dumps(c)
# 您封存了一個(gè)C對(duì)象
在通過(guò)copyreg.pickle對(duì)類型C注冊(cè)函數(shù)pickle_c之后,再去用pickle.dumps對(duì)c的對(duì)象進(jìn)行封存,就會(huì)調(diào)用pickle_c,從而打印出預(yù)設(shè)的字符串。
在copyreg.pickle中注冊(cè)的函數(shù),必須返回一個(gè)字符串或包含二至六個(gè)元素的元組。
命令行工具
python標(biāo)準(zhǔn)庫(kù)還提供了pickle的命令行工具,調(diào)用格式如下,其中x.pickle是一個(gè)封裝了python對(duì)象的二進(jìn)制文件。
python -m pickle x.pickle
常見(jiàn)的命令行選項(xiàng)如下表
| 指令 | 說(shuō)明 | |
|---|---|---|
| -a | –annotate | 使用簡(jiǎn)短的操作碼描述來(lái)標(biāo)注每一行。 |
| -o | –output=<file> | 輸出應(yīng)當(dāng)寫(xiě)入到的文件名稱。 |
| -l | –indentlevel=<num> | 一個(gè)新的 MARK 層級(jí)所需縮進(jìn)的空格數(shù)。 |
| -m | –memo | 當(dāng)反匯編多個(gè)對(duì)象時(shí),保留各個(gè)反匯編的備忘記錄。 |
| -p | –preamble=<preamble> | 當(dāng)指定一個(gè)以上的 pickle 文件時(shí),在每次反匯編之前打印給定的前言。 |
以上就是關(guān)于如何把Python對(duì)象存儲(chǔ)為文件的方法詳解的詳細(xì)內(nèi)容,更多關(guān)于Python對(duì)象存儲(chǔ)為文件的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python編程利用科赫曲線實(shí)現(xiàn)三維飄雪效果示例過(guò)程
這篇文章主要介紹了Python編程實(shí)現(xiàn)三維飄雪效果示例過(guò)程,通過(guò)本示例你可以自己做出一個(gè)浪漫的雪花飄落效果,有需要的朋友可以借鑒參考下2021-10-10
Python使用PyNmap進(jìn)行網(wǎng)絡(luò)掃描的詳細(xì)步驟
使用 PyNmap 進(jìn)行網(wǎng)絡(luò)掃描是一個(gè)非常有效的方式,PyNmap 是 Nmap 工具的一個(gè) Python 封裝,它允許你在 Python 腳本中使用 Nmap 的強(qiáng)大功能,本文介紹了如何使用 PyNmap 進(jìn)行網(wǎng)絡(luò)掃描的詳細(xì)步驟,需要的朋友可以參考下2024-08-08
python實(shí)現(xiàn)socket簡(jiǎn)單通信的示例代碼
這篇文章主要介紹了python實(shí)現(xiàn)socket簡(jiǎn)單通信的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
Python可變參數(shù)函數(shù)用法實(shí)例
這篇文章主要介紹了Python可變參數(shù)函數(shù)用法,實(shí)例分析了Python可變參數(shù)函數(shù)的定義與使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07
Tensorflow?2.1完成對(duì)MPG回歸預(yù)測(cè)詳解
這篇文章主要為大家介紹了Tensorflow?2.1完成對(duì)MPG回歸預(yù)測(cè)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
Pycharm打印大數(shù)據(jù)文件顯示不全的解決方法
這篇文章主要介紹了Pycharm打印大數(shù)據(jù)文件顯示不全的解決方法,昨晚寫(xiě)了個(gè)小爬蟲(chóng),簡(jiǎn)單分析下發(fā)現(xiàn)可以修改請(qǐng)求的url,直接獲取所有目標(biāo)的數(shù)據(jù),想先打印在控制臺(tái)看看,發(fā)現(xiàn)打印的數(shù)據(jù)不全,所以本文記錄了一下解決方法,需要的朋友可以參考下2024-03-03
Pycharm使用遠(yuǎn)程linux服務(wù)器conda/python環(huán)境在本地運(yùn)行的方法(圖解))
這篇文章主要介紹了Pycharm使用遠(yuǎn)程linux服務(wù)器conda/python環(huán)境在本地運(yùn)行的方法,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-12-12
8個(gè)Python中批量處理數(shù)據(jù)的核心庫(kù)使用指南
處理數(shù)據(jù)的時(shí)候,我發(fā)現(xiàn) Excel 有時(shí)候不好用,不是說(shuō)它的功能不好用,而是它的隱形轉(zhuǎn)換和不可復(fù)現(xiàn)輸在起跑線上了,所以本文整理了一套 Python 工具棧,有需要的小伙伴可以了解下2026-01-01

