Python數(shù)據(jù)序列化之pickle模塊
前言:
在英語中 pickle
名詞是泡菜,動詞是腌漬的意思??梢岳斫鉃榘褨|西腌起來保存成文件,要用的時(shí)候讀出來洗洗再用。
python
的pickle
模塊實(shí)現(xiàn)了基本的數(shù)據(jù)序列化和反序列化。
序列化對象可以在磁盤上保存對象,并在需要的時(shí)候讀取出來。任何對象都可以執(zhí)行序列化操作。
pickle的本質(zhì)是將Python數(shù)據(jù)還原為內(nèi)存中的二進(jìn)制數(shù)據(jù),供用戶轉(zhuǎn)移、儲存。
pickle模塊通常會在2種場景下使用:
- 將Python的數(shù)據(jù)保存為磁盤上的二進(jìn)制文件,需要時(shí)讀取還原為Python數(shù)據(jù),可以是可打印的基本數(shù)據(jù)(字符串、列表、字典等等),也可以是不可打印的類數(shù)據(jù)。相比之下,使用Json方式只能保存可打印的基本數(shù)據(jù)
- 將已經(jīng)創(chuàng)建好的類數(shù)據(jù)字符串化,保存為一個(gè)變量。在程序下次運(yùn)行時(shí)直接讀取變量還原為類數(shù)據(jù),省去類數(shù)據(jù)的創(chuàng)建過程
1 將Python數(shù)據(jù)存儲為本地文件
設(shè)計(jì)一個(gè)程序,輸出產(chǎn)物是Excel工作簿output.xlsx
,工作簿中有一個(gè)工作表out_sheet
是從 標(biāo)準(zhǔn)文檔input.xlsx
中的 in_sheet 中復(fù)制而來。
工作表in_sheet
的內(nèi)容很龐大,難以用手動重現(xiàn),通常我們會選擇將 標(biāo)準(zhǔn)文檔 input.xlsx 作為程序的引用素材放在工程里。程序運(yùn)行過程中將工作表 in_sheet復(fù)制到工作表out_sheet
中。
如果我們要求不能明文存儲 工作表 in_sheet文件,只能存儲工作表對應(yīng)的Worksheet()
數(shù)據(jù) ,將使用到pickle
模塊
① 存儲過程
import pickle from openpyxl import load_workbook # 創(chuàng)建類數(shù)據(jù) wb = load_workbook('input.xlsx') ws = wb['in_sheet'] # 將 in_sheet 復(fù)制到 out_sheet # 注意,這里的 usr_copy_sheet() 是自定義方式,openpyxl自帶的copy_sheet()不能復(fù)制不同workbook中的worksheet usr_copy_sheet(ws, out_ws) # 將out_ws轉(zhuǎn)化為二進(jìn)制數(shù)據(jù) obj = pickle.dumps(out_ws) # 將二進(jìn)制數(shù)據(jù)存到本地文件,必須使用二進(jìn)制寫入 with open(file='data.txt', mode='wb') as f: ? ? f.write(obj)
此時(shí),ws被存儲到本地文件 data.txt,打開是二進(jìn)制亂碼
② 加載過程
import pickle from openpyxl.worksheet.worksheet import Worksheet # 創(chuàng)建空的類數(shù)據(jù)準(zhǔn)備接收數(shù)據(jù),如果類有parent屬性,必須和要接收的數(shù)據(jù)保持一致 out_ws= Worksheet(parent=out_wb) # 將本地文件數(shù)據(jù)加載到類數(shù)據(jù)上,必須使用二進(jìn)制打開文件 with open(file='data.txt', mode='rb') as f: ? ? out_ws= pickle.loads(f.read())
便可以省去讀取 工作表in_sheet
,復(fù)制到工作表 out_sheet等等過程
2 將Python數(shù)據(jù)存儲為程序的一部分
如果我們要求 工作表in_sheet
文件的數(shù)據(jù)不但不能明文存儲,還不能作為外部文件,必須作為 程序.exe 的一部分,以防丟失。有些小程序一共只有一個(gè) exe文件,外掛一個(gè)文件不方便,此時(shí)可使用到pickle
模塊
① 存儲過程
import pickle from openpyxl import load_workbook # 創(chuàng)建類數(shù)據(jù) wb = load_workbook('input.xlsx') ws = wb['in_sheet'] # 將 in_sheet 復(fù)制到 out_sheet # 注意,這里的 usr_copy_sheet() 是自定義方式,openpyxl自帶的copy_sheet()不能復(fù)制不同workbook中的worksheet usr_copy_sheet(ws, out_ws) # 將out_ws轉(zhuǎn)化為二進(jìn)制數(shù)據(jù) obj = pickle.dumps(out_ws) # 將二進(jìn)制數(shù)據(jù)存為py文件,必須使用文本寫入 with open(file='out_sheet.py', mode='w') as f: ? ? # 將二進(jìn)制數(shù)據(jù)轉(zhuǎn)為 b'''xxx''' 字符串寫入 py文件 ? ? data = 'data=' + str(obj).replace('b\'', 'b\'\'\'') + '\'\'' ? ? f.write(data)
此時(shí),out_ws
被存儲到本地文件out_sheet.py,內(nèi)容是一串二進(jìn)制碼:
data=b'''\x80\x04......'''
② 加載過程
將生成的out_sheet.py
加載到程序中,直接讀取數(shù)據(jù)
import pickle from openpyxl.worksheet.worksheet import Worksheet import out_sheet # 創(chuàng)建空的類數(shù)據(jù)準(zhǔn)備接收數(shù)據(jù),如果類有parent屬性,必須和要接收的數(shù)據(jù)保持一致 out_ws= Worksheet(parent=out_wb) # 直接讀取out_sheet.py文件中的data變量 out_ws= pickle.loads(out_sheet.data)
out_sheet.py
最終會被編譯為程序的一部分
到此這篇關(guān)于Python數(shù)據(jù)序列化之pickle
模塊的文章就介紹到這了,更多相關(guān)Python中的pickle模塊內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 一文詳解python pickle中的反序列化漏洞
- Python?pickle?二進(jìn)制序列化和反序列化及數(shù)據(jù)持久化詳解
- Python Json與pickle模塊序列化使用介紹
- Python序列化模塊JSON與Pickle
- Python序列化模塊之pickle與json詳解
- Python使用pickle進(jìn)行序列化和反序列化的示例代碼
- Python序列化pickle模塊使用詳解
- Python序列化與反序列化pickle用法實(shí)例
- Python之?dāng)?shù)據(jù)序列化(json、pickle、shelve)詳解
- Python pickle模塊進(jìn)行序列化的實(shí)現(xiàn)示例
相關(guān)文章
用Python計(jì)算三角函數(shù)之a(chǎn)tan()方法的使用
這篇文章主要介紹了用Python計(jì)算三角函數(shù)之a(chǎn)tan()方法的使用,是Python入門的基礎(chǔ)知識,需要的朋友可以參考下2015-05-05Python實(shí)現(xiàn)自動發(fā)送測試報(bào)告郵件的示例代碼
SMTP也就是簡單郵件傳輸協(xié)議,是一種提供可靠且有效電子郵件傳輸?shù)膮f(xié)議,python的smtplib模塊就提供了一種很方便的途徑發(fā)送電子郵件,它對smtp協(xié)議進(jìn)行了簡單的封裝,下面就來和大家簡單聊聊吧2023-07-07Python QTimer實(shí)現(xiàn)多線程及QSS應(yīng)用過程解析
這篇文章主要介紹了Python QTimer實(shí)現(xiàn)多線程及QSS應(yīng)用過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07python使用time、datetime返回工作日列表實(shí)例代碼
這篇文章主要介紹了python使用time、datetime返回工作日列表,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05Python+Pygame實(shí)現(xiàn)接小彈珠游戲
這篇文章主要為大家詳細(xì)介紹了Python如何利用Pygame實(shí)現(xiàn)接小彈珠游戲,即用擋板接住會反彈的小球,隨著次數(shù)的增多,速度變快,分?jǐn)?shù)增多,感興趣的可以了解一下2022-12-12Python動態(tài)可視化模塊Pynimate初體驗(yàn)
Pynimate是python第三方用于動態(tài)可視化的數(shù)據(jù)模塊,是一位專攻?Python?語言的程序員開發(fā)的安裝包。本文將通過幾個(gè)簡單的示例,講解一下Pynimate的使用方法,需要的可以參考一下2023-02-02