亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python?pickle?二進制序列化和反序列化及數(shù)據(jù)持久化詳解

 更新時間:2024年01月17日 09:18:06   作者:VipSoft??博客園VIP會員  
這篇文章主要介紹了Python?pickle?二進制序列化和反序列化?-?數(shù)據(jù)持久化,模塊?pickle?實現(xiàn)了對一個?Python?對象結(jié)構(gòu)的二進制序列化和反序列化,本文介紹了Pickle的基本用法,需要的朋友可以參考下

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

pickle 模塊 并不安全。 你只應(yīng)該對你信任的數(shù)據(jù)進行 unpickle 操作。
構(gòu)建惡意的 pickle 數(shù)據(jù)來 在解封時執(zhí)行任意代碼 是可能的。 絕對不要對不信任來源的數(shù)據(jù)和可能被篡改過的數(shù)據(jù)進行解封。
請考慮使用 hmac 來對數(shù)據(jù)進行簽名,確保數(shù)據(jù)沒有被篡改。
在你處理不信任數(shù)據(jù)時,更安全的序列化格式如 json 可能更為適合。

與 json 模塊的比較

在 pickle 協(xié)議和 JSON (JavaScript Object Notation) 之間有著本質(zhì)上的差異:

  • JSON 是一個文本序列化格式(它輸出 unicode 文本,盡管在大多數(shù)時候它會接著以 utf-8 編碼),而 pickle 是一個二進制序列化格式;
  • JSON 是我們可以直觀閱讀的,而 pickle 不是;
  • JSON是可互操作的,在Python系統(tǒng)之外廣泛使用,而pickle則是Python專用的;
  • 默認情況下,JSON 只能表示 Python 內(nèi)置類型的子集,不能表示自定義的類;但 pickle 可以表示大量的 Python 數(shù)據(jù)類型(可以合理使用 Python 的對象內(nèi)省功能自動地表示大多數(shù)類型,復(fù)雜情況可以通過實現(xiàn) specific object APIs 來解決)。
  • 不像pickle,對一個不信任的JSON進行反序列化的操作本身不會造成任意代碼執(zhí)行漏洞。

Pickle的基本用法

序列化(Pickling)

要將Python對象序列化為二進制數(shù)據(jù),可以使用pickle.dump()函數(shù)。以下是一個簡單的示例,將一個Python列表保存到文件中:

import pickle
data = [1, 2, 3, 4, 5]
# 打開一個文件以寫入二進制數(shù)據(jù)
with open('data/data.pkl', 'wb') as file:
    pickle.dump(data, file)

在上述代碼中,使用pickle.dump()函數(shù)將data列表序列化為二進制數(shù)據(jù),并將其保存到名為data.pkl的文件中。參數(shù)'wb'表示以二進制寫入模式打開文件。

反序列化(Unpickling)

要從文件中加載并反序列化二進制數(shù)據(jù),可以使用pickle.load()函數(shù)。以下是加載data.pkl文件并還原Python對象的示例:

import pickle
# 打開文件以讀取二進制數(shù)據(jù)
with open('data/data.pkl', 'rb') as file:
    loaded_data = pickle.load(file)
print("反序列化 %s" % loaded_data)

在上述代碼中,使用pickle.load()函數(shù)從data.pkl文件中加載數(shù)據(jù),并將其還原為Python對象。

Pickle的工作原理

pickle模塊的工作原理涉及到將Python對象轉(zhuǎn)換為一種可序列化的中間格式,然后再將該中間格式序列化為二進制數(shù)據(jù)。這個中間格式是一個自包含的表示對象的字典,其中包含了對象的數(shù)據(jù)和其類型信息。

當(dāng)使用pickle.dump()序列化對象時,pickle 模塊首先創(chuàng)建一個包含對象數(shù)據(jù)和類型信息的中間字典。然后,它將該字典轉(zhuǎn)換為二進制數(shù)據(jù)。反序列化時,pickle模塊將二進制數(shù)據(jù)還原為中間字典,然后再從字典中還原Python對象。

這種方法使pickle模塊非常靈活,因為它可以序列化幾乎所有Python對象,包括自定義對象,只要它們可以在中間字典中表示。

Pickle的適用場景

pickle模塊在以下情況下非常有用:

  • 數(shù)據(jù)持久化:你可以使用pickle將Python對象保存到文件中,以便稍后讀取。這對于保存模型、配置文件、數(shù)據(jù)緩存等非常有用。
  • 數(shù)據(jù)傳輸:你可以使用pickle將Python對象序列化并通過網(wǎng)絡(luò)傳輸,以便不同的Python程序之間共享數(shù)據(jù)。
  • 對象復(fù)制:你可以使用pickle將Python對象進行深拷貝,以便創(chuàng)建對象的獨立副本,而不是引用原始對象。
  • 測試和調(diào)試:pickle也用于創(chuàng)建模擬數(shù)據(jù),以便進行測試和調(diào)試。

Pickle的注意事項

盡管pickle非常方便,但在使用它時需要注意一些事項:

  • 安全性:反序列化數(shù)據(jù)時要小心,因為pickle可以執(zhí)行任意代碼。不要從不受信任的來源加載pickle數(shù)據(jù),以免遭受安全風(fēng)險。
  • 版本兼容性:在不同版本的Python之間,pickle數(shù)據(jù)的兼容性可能會有問題。因此,確保在不同版本之間測試并驗證pickle數(shù)據(jù)的兼容性。
  • 自定義對象:一些自定義對象的序列化和反序列化可能會受到限制,因此需要額外的配置。你可能需要實現(xiàn)特定的__reduce__方法來控制對象的序列化行為。

示例代碼

以下是一個示例代碼,演示如何使用pickle模塊來序列化和反序列化一個自定義Python對象:

import pickle
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def __str__(self):
        return f"Person(name='{self.name}', age={self.age})"
# 創(chuàng)建一個自定義對象
person = Person("Alice", 30)
# 序列化并保存到文件
with open('data/person.pkl', 'wb') as file:
    pickle.dump(person, file)
# 從文件中加載并反序列化
with open('data/person.pkl', 'rb') as file:
    loaded_person = pickle.load(file)
print(loaded_person)  # 輸出: Person(name='Alice', age=30)

在上述代碼中,我們首先定義了一個自定義類Person,然后創(chuàng)建了一個Person對象。我們使用pickle將該對象序列化為二進制數(shù)據(jù),然后再從二進制數(shù)據(jù)中反序列化還原對象。

到此這篇關(guān)于Python pickle 二進制序列化和反序列化 - 數(shù)據(jù)持久化的文章就介紹到這了,更多相關(guān)Python pickle 二進制序列化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python實現(xiàn)定時執(zhí)行任務(wù)的三種方式簡單示例

    Python實現(xiàn)定時執(zhí)行任務(wù)的三種方式簡單示例

    這篇文章主要介紹了Python實現(xiàn)定時執(zhí)行任務(wù)的三種方式,結(jié)合簡單實例形式分析了Python使用time,os,sched等模塊定時執(zhí)行任務(wù)的相關(guān)操作技巧,需要的朋友可以參考下
    2019-03-03
  • Python基于LightGBM進行時間序列預(yù)測

    Python基于LightGBM進行時間序列預(yù)測

    LightGBM是擴展機器學(xué)習(xí)系統(tǒng)。是一款基于GBDT(梯度提升決策樹)算法的分布梯度提升框架。其設(shè)計思路主要集中在減少數(shù)據(jù)對內(nèi)存與計算性能的使用上,以及減少多機器并行計算時的通訊代價。本文將通過LightGBM進行時間序列預(yù)測,感興趣的可以了解一下
    2022-03-03
  • python文件路徑操作方法總結(jié)

    python文件路徑操作方法總結(jié)

    在本篇文章里小編給大家整理的是一篇關(guān)于python文件路徑操作方法總結(jié)內(nèi)容,有需要的朋友們可以學(xué)習(xí)下。
    2020-12-12
  • Python的爬蟲程序編寫框架Scrapy入門學(xué)習(xí)教程

    Python的爬蟲程序編寫框架Scrapy入門學(xué)習(xí)教程

    Python的一大優(yōu)勢就是可以輕松制作Web爬蟲,而超高人氣的Scrapy則是名副其實的Python編寫爬蟲的利器,這里我們就來看一下Python的爬蟲程序編寫框架Scrapy入門學(xué)習(xí)教程:
    2016-07-07
  • Python中的引用和拷貝實例解析

    Python中的引用和拷貝實例解析

    這篇文章主要介紹了python中的引用和拷貝實例解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-11-11
  • django靜態(tài)文件加載的方法

    django靜態(tài)文件加載的方法

    本篇文章主要介紹了django靜態(tài)文件加載的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • python生成n個元素的全組合方法

    python生成n個元素的全組合方法

    今天小編就為大家分享一篇python生成n個元素的全組合方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-11-11
  • python 多進程隊列數(shù)據(jù)處理詳解

    python 多進程隊列數(shù)據(jù)處理詳解

    今天小編就為大家分享一篇python 多進程隊列數(shù)據(jù)處理詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • python3實現(xiàn)全角和半角字符轉(zhuǎn)換的方法示例

    python3實現(xiàn)全角和半角字符轉(zhuǎn)換的方法示例

    在自然語言處理過程中,全角、半角的的不一致會導(dǎo)致信息抽取不一致,因此需要統(tǒng)一,下面這篇文章主要給大家介紹了關(guān)于python3中全角和半角字符轉(zhuǎn)換的方法,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-09-09
  • Python爬蟲PyQuery庫基本用法入門教程

    Python爬蟲PyQuery庫基本用法入門教程

    這篇文章主要介紹了Python爬蟲PyQuery庫基本用法,結(jié)合實例形式較為詳細的分析了pyQuery庫字符串初始化、打開網(wǎng)頁、css屬性、標(biāo)簽內(nèi)容等獲取、DOM基本操作等相關(guān)技巧與使用注意事項,需要的朋友可以參考下
    2018-08-08

最新評論