首頁 > 軟體

Python資料序列化之pickle模組

2022-03-06 10:00:55

前言:

在英語中 pickle 名詞是泡菜,動詞是醃漬的意思。可以理解為把東西醃起來儲存成檔案,要用的時候讀出來洗洗再用。

pythonpickle模組實現了基本的資料序列化和反序列化。

序列化物件可以在磁碟上儲存物件,並在需要的時候讀取出來。任何物件都可以執行序列化操作。

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'''x80x04......'''

② 載入過程

將生成的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最終會被編譯為程式的一部分

到此這篇關於Python資料序列化之pickle模組的文章就介紹到這了,更多相關Python中的pickle模組內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com