網站首頁 編程語言 正文
前言:
在英語中 pickle
名詞是泡菜,動詞是腌漬的意思。可以理解為把東西腌起來保存成文件,要用的時候讀出來洗洗再用。
python
的pickle
模塊實現了基本的數據序列化和反序列化。
序列化對象可以在磁盤上保存對象,并在需要的時候讀取出來。任何對象都可以執行序列化操作。
pickle的本質是將Python數據還原為內存中的二進制數據,供用戶轉移、儲存。
pickle模塊通常會在2種場景下使用:
- 將Python的數據保存為磁盤上的二進制文件,需要時讀取還原為Python數據,可以是可打印的基本數據(字符串、列表、字典等等),也可以是不可打印的類數據。相比之下,使用Json方式只能保存可打印的基本數據
- 將已經創建好的類數據字符串化,保存為一個變量。在程序下次運行時直接讀取變量還原為類數據,省去類數據的創建過程
1 將Python數據存儲為本地文件
設計一個程序,輸出產物是Excel工作簿output.xlsx
,工作簿中有一個工作表out_sheet
是從 標準文檔input.xlsx
中的 in_sheet 中復制而來。
工作表in_sheet
的內容很龐大,難以用手動重現,通常我們會選擇將 標準文檔 input.xlsx 作為程序的引用素材放在工程里。程序運行過程中將工作表 in_sheet復制到工作表out_sheet
中。
如果我們要求不能明文存儲 工作表 in_sheet文件,只能存儲工作表對應的Worksheet()
數據 ,將使用到pickle
模塊
① 存儲過程
import pickle from openpyxl import load_workbook # 創建類數據 wb = load_workbook('input.xlsx') ws = wb['in_sheet'] # 將 in_sheet 復制到 out_sheet # 注意,這里的 usr_copy_sheet() 是自定義方式,openpyxl自帶的copy_sheet()不能復制不同workbook中的worksheet usr_copy_sheet(ws, out_ws) # 將out_ws轉化為二進制數據 obj = pickle.dumps(out_ws) # 將二進制數據存到本地文件,必須使用二進制寫入 with open(file='data.txt', mode='wb') as f: ? ? f.write(obj)
此時,ws被存儲到本地文件 data.txt,打開是二進制亂碼
② 加載過程
import pickle from openpyxl.worksheet.worksheet import Worksheet # 創建空的類數據準備接收數據,如果類有parent屬性,必須和要接收的數據保持一致 out_ws= Worksheet(parent=out_wb) # 將本地文件數據加載到類數據上,必須使用二進制打開文件 with open(file='data.txt', mode='rb') as f: ? ? out_ws= pickle.loads(f.read())
便可以省去讀取 工作表in_sheet
,復制到工作表 out_sheet等等過程
2 將Python數據存儲為程序的一部分
如果我們要求 工作表in_sheet
文件的數據不但不能明文存儲,還不能作為外部文件,必須作為 程序.exe 的一部分,以防丟失。有些小程序一共只有一個 exe文件,外掛一個文件不方便,此時可使用到pickle
模塊
① 存儲過程
import pickle from openpyxl import load_workbook # 創建類數據 wb = load_workbook('input.xlsx') ws = wb['in_sheet'] # 將 in_sheet 復制到 out_sheet # 注意,這里的 usr_copy_sheet() 是自定義方式,openpyxl自帶的copy_sheet()不能復制不同workbook中的worksheet usr_copy_sheet(ws, out_ws) # 將out_ws轉化為二進制數據 obj = pickle.dumps(out_ws) # 將二進制數據存為py文件,必須使用文本寫入 with open(file='out_sheet.py', mode='w') as f: ? ? # 將二進制數據轉為 b'''xxx''' 字符串寫入 py文件 ? ? data = 'data=' + str(obj).replace('b\'', 'b\'\'\'') + '\'\'' ? ? f.write(data)
此時,out_ws
被存儲到本地文件out_sheet.py,內容是一串二進制碼:
data=b'''\x80\x04......'''
② 加載過程
將生成的out_sheet.py
加載到程序中,直接讀取數據
import pickle from openpyxl.worksheet.worksheet import Worksheet import out_sheet # 創建空的類數據準備接收數據,如果類有parent屬性,必須和要接收的數據保持一致 out_ws= Worksheet(parent=out_wb) # 直接讀取out_sheet.py文件中的data變量 out_ws= pickle.loads(out_sheet.data)
out_sheet.py
最終會被編譯為程序的一部分
原文鏈接:https://blog.csdn.net/u011079613/article/details/123302828
相關推薦
- 2022-11-12 詳解Golang如何實現支持隨機刪除元素的堆_Golang
- 2022-09-20 C#?Winform實現圓角無鋸齒按鈕_C#教程
- 2022-05-15 react底層的四大核心內容架構詳解_React
- 2022-08-26 Rust+React創建富文本編輯器_React
- 2023-06-16 C#函數out多個返回值問題_C#教程
- 2021-12-10 時間戳處理的幾種方式
- 2022-07-26 css媒體查詢
- 2023-12-02 vscode無法連接寶塔ftp排雷
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支