最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python3 Pickle 模塊基本用法詳解

 更新時(shí)間:2025年11月12日 09:08:44   作者:小陶coding  
本文將系統(tǒng)講解pickle模塊的工作原理、基本用法、高級(jí)特性及注意事項(xiàng),幫助你在實(shí)際開(kāi)發(fā)中靈活運(yùn)用對(duì)象持久化技術(shù),感興趣的朋友跟隨小編一起看看吧

在 Python 中,pickle模塊是實(shí)現(xiàn)對(duì)象序列化與反序列化的核心工具,它能將 Python 對(duì)象(如列表、字典、類實(shí)例等)轉(zhuǎn)換為字節(jié)流以便存儲(chǔ)或傳輸,也能將字節(jié)流恢復(fù)為原始對(duì)象。本文將系統(tǒng)講解pickle模塊的工作原理、基本用法、高級(jí)特性及注意事項(xiàng),幫助你在實(shí)際開(kāi)發(fā)中靈活運(yùn)用對(duì)象持久化技術(shù)。

一、核心概念:序列化與反序列化

  • 序列化(pickling):將 Python 對(duì)象轉(zhuǎn)換為字節(jié)流(二進(jìn)制數(shù)據(jù))的過(guò)程,便于存儲(chǔ)到文件或通過(guò)網(wǎng)絡(luò)傳輸。
  • 反序列化(unpickling):將字節(jié)流恢復(fù)為 Python 對(duì)象的過(guò)程,從文件或網(wǎng)絡(luò)數(shù)據(jù)中重建原始對(duì)象。

pickle模塊支持幾乎所有 Python 內(nèi)置對(duì)象的序列化,包括:

  • 基本數(shù)據(jù)類型(int、float、str、bool、None);
  • 容器類型(list、tuple、dict、set);
  • 自定義類實(shí)例、函數(shù)、類(需注意特殊處理)。

二、基本用法:pickle 的核心函數(shù)

pickle模塊的核心功能通過(guò)四個(gè)函數(shù)實(shí)現(xiàn):dump()dumps()、load()、loads(),區(qū)分在于是否直接操作文件對(duì)象。

1. 序列化:dump()與dumps()

  • pickle.dump(obj, file, protocol=None):將對(duì)象obj序列化后寫(xiě)入文件對(duì)象file(需以二進(jìn)制模式打開(kāi))。
  • pickle.dumps(obj, protocol=None):將對(duì)象obj序列化為字節(jié)流(bytes類型),返回該字節(jié)流。

示例:序列化基本對(duì)象

import pickle
# 定義一個(gè)復(fù)雜對(duì)象(包含多種類型)
data = {
    "name": "Alice",
    "age": 30,
    "hobbies": ["reading", "hiking"],
    "is_student": False,
    "scores": (90.5, 85.0)
}
# 方法1:用dumps()序列化為字節(jié)流
data_bytes = pickle.dumps(data)
print("序列化結(jié)果(字節(jié)流):", data_bytes)  # 輸出b'\x80\x04...'(二進(jìn)制數(shù)據(jù))
# 方法2:用dump()序列化到文件
with open("data.pkl", "wb") as f:  # 必須用二進(jìn)制模式"wb"
    pickle.dump(data, f)

2. 反序列化:load()與loads()

  • pickle.load(file):從文件對(duì)象file(二進(jìn)制模式打開(kāi))中讀取字節(jié)流,反序列化為 Python 對(duì)象并返回。
  • pickle.loads(bytes_obj):將字節(jié)流bytes_obj反序列化為 Python 對(duì)象并返回。

示例:反序列化恢復(fù)對(duì)象

import pickle
# 方法1:用loads()從字節(jié)流反序列化
data_bytes = pickle.dumps({"name": "Alice"})
restored_data = pickle.loads(data_bytes)
print("從字節(jié)流恢復(fù):", restored_data)  # 輸出 {'name': 'Alice'}
# 方法2:用load()從文件反序列化
with open("data.pkl", "rb") as f:  # 必須用二進(jìn)制模式"rb"
    restored_from_file = pickle.load(f)
print("從文件恢復(fù):", restored_from_file)  # 輸出原始data字典

三、高級(jí)特性:自定義類的序列化

pickle不僅支持內(nèi)置對(duì)象,還能序列化自定義類的實(shí)例,但需要注意類定義的可訪問(wèn)性(反序列化時(shí)需能導(dǎo)入原類)。

1. 基本自定義類序列化

import pickle
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def greet(self):
        return f"Hello, I'm {self.name}!"
# 創(chuàng)建實(shí)例
person = Person("Bob", 25)
# 序列化
person_bytes = pickle.dumps(person)
# 反序列化(需確保Person類在當(dāng)前作用域中)
restored_person = pickle.loads(person_bytes)
print(restored_person.greet())  # 輸出 "Hello, I'm Bob!"
print(restored_person.age)      # 輸出 25

2. 自定義序列化邏輯(__getstate__與__setstate__)

默認(rèn)情況下,pickle會(huì)序列化對(duì)象的__dict__(實(shí)例屬性字典),但你可以通過(guò)以下方法自定義序列化內(nèi)容:

  • __getstate__():返回需要序列化的數(shù)據(jù)(如字典),替代默認(rèn)的__dict__;
  • __setstate__(state):接收反序列化后的數(shù)據(jù)state,用于恢復(fù)對(duì)象狀態(tài)。

示例:過(guò)濾敏感信息

import pickle
class User:
    def __init__(self, username, password):
        self.username = username
        self.password = password  # 敏感信息,不希望被序列化
    # 自定義序列化內(nèi)容:只保留username
    def __getstate__(self):
        return {"username": self.username}
    # 自定義反序列化邏輯:恢復(fù)狀態(tài)
    def __setstate__(self, state):
        self.username = state["username"]
        self.password = "default"  # 反序列化時(shí)密碼設(shè)為默認(rèn)值
# 創(chuàng)建實(shí)例
user = User("alice123", "secret123")
# 序列化
user_bytes = pickle.dumps(user)
# 反序列化
restored_user = pickle.loads(user_bytes)
print(restored_user.username)  # 輸出 "alice123"
print(restored_user.password)  # 輸出 "default"(敏感信息未被序列化)

四、協(xié)議版本:影響序列化效率與兼容性

pickle支持多種序列化協(xié)議(版本),不同版本在效率、兼容性上有差異:

  • 協(xié)議 0:文本格式,兼容舊版本 Python(默認(rèn)在 Python 2 中),效率低;
  • 協(xié)議 1:二進(jìn)制格式,兼容 Python 2 和 3;
  • 協(xié)議 2:Python 2.3 + 引入,支持新特性(如新式類);
  • 協(xié)議 3:Python 3.0 + 引入,不兼容 Python 2;
  • 協(xié)議 4:Python 3.4 + 引入,支持更大對(duì)象、更多類型(如bytesset等),是 Python 3.8 + 的默認(rèn)協(xié)議。

指定協(xié)議版本:通過(guò)protocol參數(shù)設(shè)置(如protocol=4),值越高通常效率越好(但兼容性可能降低)。

import pickle
data = [i for i in range(1000)]
# 使用協(xié)議4序列化(效率更高)
data_bytes = pickle.dumps(data, protocol=4)

五、注意事項(xiàng):安全與兼容性問(wèn)題

1. 安全性風(fēng)險(xiǎn):反序列化不可信數(shù)據(jù)

pickle反序列化時(shí)會(huì)執(zhí)行字節(jié)流中包含的代碼,若從不可信來(lái)源(如網(wǎng)絡(luò)、未知文件)加載數(shù)據(jù),可能導(dǎo)致惡意代碼執(zhí)行(如刪除文件、竊取信息)。

禁止反序列化未知來(lái)源的數(shù)據(jù),若需網(wǎng)絡(luò)傳輸,建議使用更安全的格式(如 JSON,僅支持基礎(chǔ)類型)。

2. 兼容性問(wèn)題

  • 類定義變化:若反序列化時(shí)的類定義與序列化時(shí)不同(如新增 / 刪除屬性、修改類名),可能導(dǎo)致反序列化失?。?/li>
  • 跨版本兼容性:高版本協(xié)議(如 4)序列化的數(shù)據(jù)無(wú)法在低版本 Python(如 3.3 以下)中反序列化;
  • 模塊路徑變化:若類所在的模塊路徑改變(如從moduleA移到moduleB),反序列化時(shí)需確保能正確導(dǎo)入類。

3. 不支持的類型

部分 Python 對(duì)象無(wú)法被序列化,例如:

  • 生成器、lambda 函數(shù)(匿名函數(shù));
  • 線程、進(jìn)程、文件對(duì)象等與系統(tǒng)資源相關(guān)的對(duì)象;
  • 某些內(nèi)置模塊的對(duì)象(如sys.stdin)。

序列化這些對(duì)象會(huì)拋出PickleError。

六、實(shí)戰(zhàn)場(chǎng)景:對(duì)象持久化與數(shù)據(jù)緩存

1. 保存程序狀態(tài)(持久化)

將程序運(yùn)行中的關(guān)鍵對(duì)象(如配置、中間結(jié)果)保存到文件,下次運(yùn)行時(shí)直接恢復(fù),避免重復(fù)計(jì)算。

import pickle
import time
def expensive_computation():
    # 模擬耗時(shí)計(jì)算
    time.sleep(3)
    return [i**2 for i in range(1000)]
# 檢查是否有緩存
try:
    with open("result_cache.pkl", "rb") as f:
        result = pickle.load(f)
        print("從緩存加載結(jié)果")
except FileNotFoundError:
    # 無(wú)緩存則計(jì)算并保存
    result = expensive_computation()
    with open("result_cache.pkl", "wb") as f:
        pickle.dump(result, f)
    print("計(jì)算完成并緩存")

2. 跨進(jìn)程數(shù)據(jù)傳遞

在多進(jìn)程編程中,pickle是進(jìn)程間傳遞復(fù)雜對(duì)象的默認(rèn)方式(如multiprocessing模塊依賴pickle序列化數(shù)據(jù))。

from multiprocessing import Process
import pickle
def process_data(data):
    print("子進(jìn)程接收數(shù)據(jù):", data)
if __name__ == "__main__":
    # 定義復(fù)雜對(duì)象
    data = {"task": "process", "params": [1, 2, 3]}
    # 多進(jìn)程會(huì)自動(dòng)序列化data并傳遞給子進(jìn)程
    p = Process(target=process_data, args=(data,))
    p.start()
    p.join()

七、與 JSON 的對(duì)比:何時(shí)用 pickle?

特性pickleJSON
支持類型幾乎所有 Python 對(duì)象(類實(shí)例、函數(shù)等)僅基礎(chǔ)類型(str、int、list、dict 等)
數(shù)據(jù)格式二進(jìn)制(不可讀)文本(人類可讀)
安全性不安全(可能執(zhí)行惡意代碼)安全(純數(shù)據(jù)解析)
跨語(yǔ)言支持僅 Python所有主流語(yǔ)言支持
用途Python 內(nèi)部對(duì)象持久化、進(jìn)程間通信跨語(yǔ)言數(shù)據(jù)交換、配置文件

選擇建議

  • 僅在 Python 生態(tài)內(nèi)使用,且需要序列化復(fù)雜對(duì)象(如類實(shí)例)→ 用pickle;
  • 需跨語(yǔ)言交互,或數(shù)據(jù)需人類可讀、可編輯 → 用 JSON。

總結(jié)

pickle模塊是 Python 對(duì)象序列化的核心工具,通過(guò)dump()/dumps()load()/loads()實(shí)現(xiàn)對(duì)象與字節(jié)流的轉(zhuǎn)換,支持自定義類實(shí)例及復(fù)雜數(shù)據(jù)結(jié)構(gòu)。但需注意其安全性風(fēng)險(xiǎn)(禁止處理不可信數(shù)據(jù))和兼容性限制。

在實(shí)際開(kāi)發(fā)中,pickle適用于 Python 內(nèi)部的對(duì)象持久化、進(jìn)程間通信等場(chǎng)景,是提升程序效率和靈活性的重要手段。合理使用pickle,可簡(jiǎn)化復(fù)雜數(shù)據(jù)的存儲(chǔ)與傳輸邏輯。

到此這篇關(guān)于Python3 Pickle 模塊詳解的文章就介紹到這了,更多相關(guān)python pickle 模塊內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺談python量化 雙均線策略(金叉死叉)

    淺談python量化 雙均線策略(金叉死叉)

    這篇文章主要介紹了淺談python量化 雙均線策略(金叉死叉),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-06-06
  • Python爬取qq空間說(shuō)說(shuō)的實(shí)例代碼

    Python爬取qq空間說(shuō)說(shuō)的實(shí)例代碼

    這篇文章主要介紹了Python爬取qq空間說(shuō)說(shuō)的實(shí)例代碼,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2018-08-08
  • Python選課系統(tǒng)開(kāi)發(fā)程序

    Python選課系統(tǒng)開(kāi)發(fā)程序

    這篇文章主要為大家詳細(xì)介紹了Python選課系統(tǒng)開(kāi)發(fā)程序,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • OpenCV連通域數(shù)量統(tǒng)計(jì)學(xué)習(xí)示例

    OpenCV連通域數(shù)量統(tǒng)計(jì)學(xué)習(xí)示例

    這篇文章主要為大家介紹了OpenCV連通域數(shù)量統(tǒng)計(jì)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • 對(duì)python數(shù)據(jù)清洗容易遇到的函數(shù)-re.sub bytes string詳解

    對(duì)python數(shù)據(jù)清洗容易遇到的函數(shù)-re.sub bytes string詳解

    今天小編就為大家分享一篇對(duì)python數(shù)據(jù)清洗容易遇到的函數(shù)-re.sub bytes string詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-07-07
  • Python配置文件解析模塊ConfigParser使用實(shí)例

    Python配置文件解析模塊ConfigParser使用實(shí)例

    這篇文章主要介紹了Python配置文件解析模塊ConfigParser使用實(shí)例,本文講解了figParser簡(jiǎn)介、ConfigParser 初始工作、ConfigParser 常用方法、ConfigParser使用實(shí)例等內(nèi)容,需要的朋友可以參考下
    2015-04-04
  • Win10?Anaconda?新建環(huán)境安裝python-pcl的步驟

    Win10?Anaconda?新建環(huán)境安裝python-pcl的步驟

    這篇文章主要介紹了Win10?Anaconda?新建環(huán)境安裝python-pcl的方法,至于VS環(huán)境下安裝C++?版本的pcl也可以按照此文提供的步驟安裝實(shí)現(xiàn),需要的朋友可以參考下
    2022-04-04
  • Python實(shí)現(xiàn)base64編碼

    Python實(shí)現(xiàn)base64編碼

    這篇文章介紹了Python實(shí)現(xiàn)base64編碼的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • 如何使用repr調(diào)試python程序

    如何使用repr調(diào)試python程序

    這篇文章主要介紹了如何使用repr調(diào)試python程序,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • Python面向?qū)ο笾惡蛯?shí)例用法分析

    Python面向?qū)ο笾惡蛯?shí)例用法分析

    這篇文章主要介紹了Python類和實(shí)例用法,較為詳細(xì)的分析了Python面向?qū)ο蟪绦蛟O(shè)計(jì)中類、實(shí)例、構(gòu)造函數(shù)、析構(gòu)函數(shù)、私有變量等相關(guān)概念與使用技巧,需要的朋友可以參考下
    2019-06-06

最新評(píng)論

台湾省| 鄯善县| 侯马市| 金溪县| 滦南县| 离岛区| 将乐县| 正蓝旗| 乌兰察布市| 红桥区| 锦州市| 柘荣县| 新丰县| 永平县| 岳西县| 固镇县| 吉水县| 柘荣县| 泾川县| 双柏县| 习水县| 兴文县| 塔河县| 陈巴尔虎旗| 犍为县| 灵宝市| 绥中县| 新和县| 阿克| 耿马| 顺昌县| 南靖县| 伊春市| 星座| 久治县| 石屏县| 始兴县| 清水县| 云南省| 香港 | 凭祥市|