python3序列化模塊之pickle

官方文檔

簡介

pickle 是 Python 中用于對象序列化和反序列化的標準庫模塊。它可以將 Python 對象轉換為字節流,并將其保存到文件或通過網絡傳輸,在需要時再將其恢復為原來的 Python 對象。

模塊 pickle 實現了對一個 Python 對象結構的二進制序列化和反序列化。 “pickling” 是將 Python 對象及其所擁有的層次結構轉化為一個字節流的過程,而 “unpickling” 是相反的操作,會將(來自一個 binary file 或者 bytes-like object 的)字節流轉化回一個對象層次結構。 pickling(和 unpickling)也被稱為“序列化”, “編組” 或者 “平面化”。而為了避免混亂,此處采用術語 “封存 (pickling)” 和 “解封 (unpickling)”。

常見用法

保存和加載 Python 對象

保存和加載 Python 函數
def my_function(x):return x * 2with open('function.pkl', 'wb') as f:pickle.dump(my_function, f)with open('function.pkl', 'rb') as f:loaded_function = pickle.load(f)
print(loaded_function(5))  # 輸出 10
保存和加載 Python 模塊

import my_module
with open('module.pkl', 'wb') as f:pickle.dump(my_module, f)with open('module.pkl', 'rb') as f:loaded_module = pickle.load(f)
print(loaded_module.my_function(5))  # 假設 my_module 有一個 my_function 函數

序列化和反序列化

將對象序列化為字節串:
import pickledata = {'a': 1, 'b': 2, 'c': 3}
serialized_data = pickle.dumps(data)
print(serialized_data)  # 輸出字節串
從字節串反序列化為對象:
loaded_data = pickle.loads(serialized_data)
print(loaded_data)  # 輸出 {'a': 1, 'b': 2, 'c': 3}

處理復雜對象

pickle 可以序列化大多數 Python 對象,包括自定義類的實例:

class Person:def __init__(self, name, age):self.name = nameself.age = ageperson = Person('Alice', 30)
with open('person.pkl', 'wb') as f:pickle.dump(person, f)with open('person.pkl', 'rb') as f:loaded_person = pickle.load(f)
print(loaded_person.name, loaded_person.age)  # 輸出 Alice 30

增強安全性

由于 pickle 反序列化可能存在安全隱患,可以使用 pickle.Unpickler 類來增強安全性:

import pickle
from io import BytesIOclass CustomUnpickler(pickle.Unpickler):def find_class(self, module, name):# 只允許反序列化指定的類if module == 'builtins' and name in ['dict', 'list', 'tuple']:return super().find_class(module, name)raise pickle.UnpicklingError(f"Refused to unpickle class: {module}.{name}")data = b'...'  # 從不可信來源獲取的序列化數據
bio = BytesIO(data)
unpickler = CustomUnpickler(bio)
try:unpickler.load()
except pickle.UnpicklingError as e:print(f"Error: {e}")

通過網絡傳輸 Python 對象

可以將序列化后的對象通過網絡傳輸,在接收端再反序列化為原對象。這在分布式系統中很有用。

保存復雜的 Python 對象

pickle 可以序列化大多數 Python 對象,包括類實例、函數、模塊等。這使得它能夠保存和恢復復雜的 Python 數據結構。

實現對象持久化

通過 pickle 可以將 Python 對象保存到文件中,實現對象的持久化存儲。這在需要保存程序狀態或緩存數據的場景下很有用。

總結

需要注意的是,pickle 模塊并不安全,不建議用于處理不可信的數據。因為反序列化的過程可能會執行任意的 Python 代碼,存在安全隱患。在使用 pickle 時,應確保數據的來源是可信的。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/14269.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/14269.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/14269.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何快速增加外鏈?

要快速增加外鏈并不難,相信各位都知道,難的是快速增加外鏈且沒有風險,所以這時候GNB外鏈的重要性就出現了,這是一種自然的外鏈,何謂自然的外鏈,在谷歌的體系當中,自然外鏈指的就是其他網站資源給…

mysql 、oss 結合使用

以下是一個使用 Express、MySQL、OSS 和 axios 的 Node.js 示例。這個示例創建了一個 Express 服務器,該服務器有一個路由用于處理視頻上傳的請求。視頻文件首先被上傳到 OSS,然后視頻的 OSS URL 被存儲到 MySQL 數據庫。 首先,我們需要安裝必…

最大負載1kg!高度模塊化設計!大象機器人智能遙控操作機械臂組合myArm MC

引入 近年來,市面上涌現了許多類似于斯坦福大學的 Alopha 機器人項目,這些項目主要通過模仿人類的運動軌跡來進行學習,實現了仿人類的人工智能。Alopha 機器人通過先進的算法和傳感技術,能夠精確復制人類的動作,并從中…

【stm32】——使用HAL庫點燈

目錄 一、安裝STM32CubeMX 二、HAL庫點亮LED燈 1.STM32CubeMX創建項目 2.進入Keil編寫代碼 三、采用中斷控制LED燈的亮滅 1.創建項目 2.Keil中編寫代碼 四、Keil波形分析 總結 一、安裝STM32CubeMX 具體操作可以參考下面鏈接: 搭建STM32開發環境——STM32CubeMX&a…

用Python pynput庫捕捉每一次組合鍵的優雅舞步

哈嘍,大家好,我是木頭左! 一、初識pynput:鍵盤與鼠標的監控利器 當談論計算機交互時,鍵盤和鼠標無疑是最常用的設備。無論是編寫代碼、瀏覽網頁還是玩游戲,都依賴于這些輸入設備與機器溝通。但在一些特殊的…

藍橋杯單片機-國賽5——各外設時序記憶方法及手冊重點提取

藍橋杯涉及三個通訊外設,時序很難記憶,因此本文重點在于記錄如何不背時序,直接看手冊 注意:本文參考2024年第15屆比賽手冊講解,沒有英文基礎也沒關系 每一個外設會在第一張時序圖中詳細講解,后續簡寫&…

【DevOps】深入理解 Nginx Location 塊:配置示例與應用場景詳解

目錄 一、location 塊的基本概念 二、location 塊的語法 三、location 塊的匹配方式 四、location 塊的優先級 五、location 塊的應用場景 六、location 塊的嵌套 七、location 塊的指令 八、示例配置 Nginx 是一個高性能的 Web 服務器和反向代理服務器,它廣…

網站工作原理

web發展史 1.0時代不可修改 2.0可修改,比如發微博 有以下問題: 課程2: 靜態頁面 html 動態頁面 php 經過服務端的語言解釋器,解析成html文件,剩下的就和靜態流程一樣 后面三個是web服務器,語言解釋器&…

邊緣人工智能中的視頻目標檢測方法詳解

隨著邊緣計算和人工智能技術的發展,視頻目標檢測在邊緣設備上的應用變得越來越普遍。這些應用包括智能監控、自動駕駛、無人機巡檢等。為了在資源受限的邊緣設備上實現高效的目標檢測,選擇合適的算法和工具至關重要。本文將詳細介紹幾種適用于邊緣設備的…

算法刷題day53:樹形DP

目錄 引言一、沒有上司的舞會二、樹的重心三、樹的最長路徑四、樹的中心五、數字轉換 引言 關于這個樹形 D P DP DP 啊,其實感覺就是對樹進行 D F S DFS DFS 只不過有一個返回值罷了,這個返回值一般代表的就是以該結點為根的子樹的一個屬性&#xff0…

[Spring Boot]baomidou 多數據源

文章目錄 簡述本文涉及代碼已開源 項目配置pom引入baomidouyml增加dynamic配置啟動類增加注解配置結束 業務調用注解DS()TransactionalDSTransactional自定義數據源注解MySQL2 測試調用查詢接口單數據源事務測試多數據源事務如果依然使用Transactional會怎樣?測試正…

dubbo復習: (6)和springboot集成時的條件路由

根據指定的條件,對不滿足條件的請求進行攔截。 比如攔截ip地址為192.168.31.227的請求。只需要在dubbo admin中的條件路由菜單創建相應的規則 enabled: true force: true runtime: true conditions:- host ! 192.168.31.227

vlan綜合實驗

一,實驗拓撲: 二,實驗需求: 1、pc1和pc3所在接口為access;屬于vlan 2;P可以驕問pcepces不的一段;其中pc2可以訪問pc4/pc5/pc6; 2、pc1/pc3與pc2/pc4/pc5/pc6不在同一網段; 3、所有pc通過DHCP獲取Ip地址,且pc1/pc3可以…

Golang框架HTTP客戶端框架zdpgo_resty發送表單請求

核心代碼 這里通過字典傳遞了一個簡單的表單數據。 發送的是POST請求。 resp, err : client.R().SetFormData(map[string]string{"username": "jeeva","password": "mypass",}).Post("http://127.0.0.1:3333/login")fmt.P…

Java NIO庫中三個不同的類Files、Path和Paths

Files.Path.Paths 三個類是 Java NIO(New I/O)框架的一部分,用于處理 Java 程序中的文件系統操作。讓我們詳細介紹一下這三個類:1. java.nio.file.Files 類: - Files 類是 Java NIO 框架的核心部分,提供…

輕松搞定LOGO渲染,用ComfyUI快速生成炫酷效果圖!

一、準備工作一鍵搞定 必備資源:墊圖和風格參考圖 墊圖:提供LOGO的基礎參考。 風格參考圖:確定LOGO的最終效果風格。 節點信息:一鍵配置 自定義節點(9):包括ComfyUI_Comfyroll_CustomNodes, …

【安裝筆記-20240524-Windows-安裝測試 7-Zip】

安裝筆記-系列文章目錄 安裝筆記-20240524-Windows-安裝測試 7-Zip 文章目錄 安裝筆記-系列文章目錄安裝筆記-20240524-Windows-安裝測試 7-Zip 前言一、軟件介紹名稱:7-Zip主頁官方介紹7-Zip 主要特征 二、安裝步驟測試版本:24.05 (2024-05-14) for Wi…

burpsuite抓包響應報文亂碼

1、響應報文中的中文信息亂碼 2、解決辦法 3、設置成功后重新發起請求

數據可視化-匯總

九大數據分析方法-綜合型分析方法以及如何使用這九大分析方法 九大數據分析方法-單指標分析方法與多指標分析方法 數據分析方法與模型 電商數據分析:只會環比下降3%的數據分析師還有救嗎? 數據可視化第二版-拓展-和鯨網約車分析一等獎作品 Echarts5…