python中的pickle模塊和json模塊

目錄

pickle:

Python 中的pickle 是一個內置模塊,用于序列化和反序列化 Python 對象結構。序列化是將對象轉換成字節流的過程,這樣對象就可以被存儲到文件中或者通過網絡傳輸。反序列化則是將這些字節流重新轉換成原始對象的過程。

json:

json模塊是 Python 中用于處理 JSON 數據格式的內置模塊。JSON(JavaScript Object Notation)是一種文本格式,用于在不同系統之間傳輸數據。它基于 JavaScript 的對象和數組表示,但已經被許多編程語言支持,包括 Python。

問題引入:

使用 pickle 模塊序列化和反序列化

使用 json 模塊序列化和反序列化

pickle用法:

語法概覽

示例

序列化(Pickle)

json的用法

語法概覽

示例


pickle:

Python 中的pickle 是一個內置模塊,用于序列化和反序列化 Python 對象結構。序列化是將對象轉換成字節流的過程,這樣對象就可以被存儲到文件中或者通過網絡傳輸。反序列化則是將這些字節流重新轉換成原始對象的過程。

json:

json模塊是 Python 中用于處理 JSON 數據格式的內置模塊。JSON(JavaScript Object Notation)是一種文本格式,用于在不同系統之間傳輸數據。它基于 JavaScript 的對象和數組表示,但已經被許多編程語言支持,包括 Python。

問題引入:

# define a dict object
obj={"name":"Bonnie","isAGirl":True,"age":22,"hobbies":["guitar","singing","traveling"]"ss":None
}
# 將obj寫入已打開的二進制文件,序列化
f =open("test.txt","w")
f.write(obj)

報錯:

Traceback (most recent call last):File "E:\桌面\計算機\全棧\django\django項目\untitled1\ll.py", line 10, in <module>f.write(obj)
TypeError: write() argument must be str, not dict

原因:

在 Python 中,不能直接使用 write 方法將字典對象寫入文件,因為 write 方法只能處理字符串或字節序列。要將字典對象序列化并寫入文件,你需要使用 pickle 模塊。以下是如何使用 pickle 模塊將字典對象序列化并寫入文件的正確方式:

python
import pickle# 定義一個字典對象
obj = {"name": "Bonnie","isAGirl": True,"age": 22,"hobbies": ["guitar", "singing", "traveling"]
}# 使用 'wb' 模式打開文件,以便寫入二進制數據
with open("test.pkl", "wb") as f:# 使用 pickle.dump 將對象序列化并寫入文件pickle.dump(obj, f)

請注意以下幾點:

  1. 文件模式應為 'wb',表示以二進制寫入模式打開文件。
  2. 使用 pickle.dump 而不是 f.write 來序列化對象并寫入文件。
  3. 我將文件擴展名從 .txt 改為 .pkl,以表明這是一個使用 pickle 模塊序列化的文件。

如果你想要從這個文件中讀取并反序列化對象,可以使用以下代碼:

python
# 使用 'rb' 模式打開文件,以便讀取二進制數據
with open("test.pkl", "rb") as f:# 使用 pickle.load 從文件中讀取并反序列化對象loaded_obj = pickle.load(f)
print(loaded_obj)
 

這將輸出原始字典對象。

那問題json處理可以嗎?

讓我們通過一個例子來比較 pickle 和 json 模塊在處理 Python 中特殊數據類型時的不同。

首先,我們定義一個包含 Python 特殊數據類型和自定義對象的復雜數據結構:

python
class Person:def __init__(self, name, age):self.name = nameself.age = age# 創建一個包含特殊數據類型和自定義對象的字典
complex_obj = {"name": "Bonnie","is_girl": True,"age": 22,"hobbies": ["guitar", "singing", "traveling"],"nothing": None,"bytes_data": b"byte data","person": Person("Bonnie", 22)
}

使用 pickle 模塊序列化和反序列化

使用 pickle 可以輕松地序列化和反序列化上述包含特殊數據類型的復雜對象:

python
import pickle# 使用 pickle 序列化對象
with open('complex_obj.pkl', 'wb') as f:pickle.dump(complex_obj, f)# 使用 pickle 反序列化對象
with open('complex_obj.pkl', 'rb') as f:loaded_obj = pickle.load(f)print(loaded_obj)

pickle 模塊能夠處理 None、bytes 類型以及自定義對象 Person,并且能夠保持對象的結構和類型。

使用 json 模塊序列化和反序列化

當我們嘗試使用 json 模塊來序列化相同的對象時,會遇到問題:

python
import json# 嘗試使用 json 序列化對象
try:json_string = json.dumps(complex_obj)
except TypeError as e:print("JSON serialization error:", e)

這段代碼會拋出一個 TypeError,因為 json.dumps() 無法處理 None 類型、bytes 類型和自定義對象 Person。為了能夠使用 json 序列化,我們需要定義一個自定義的序列化函數來處理這些特殊類型:

python
def my_encoder(obj):if isinstance(obj, bytes):return obj.decode('utf-8')  # 假設 bytes 對象是 UTF-8 編碼的字符串raise TypeError(f"Object of type '{obj.__class__.__name__}' is not JSON serializable")# 使用自定義的序列化函數
json_string = json.dumps(complex_obj, default=my_encoder)# 將 JSON 字符串寫入文件
with open('complex_obj.json', 'w') as f:f.write(json_string)# 反序列化時,我們失去了類型信息,只能得到一個普通的字典
loaded_obj_json = json.loads(json_string)
print(loaded_obj_json)

在這個例子中,我們定義了一個 my_encoder 函數來處理 bytes 類型,將其解碼為字符串。但是,對于 None 類型和自定義對象 Person,我們仍然無法直接序列化。即使對于 bytes,我們也失去了原始的二進制數據,因為它被解碼為了字符串。

通過這個例子,你可以看到 pickle 和 json 在處理特殊數據類型時的不同。pickle 更加靈活,能夠處理幾乎所有的 Python 對象,而 json 則更加通用和安全,但需要處理一些數據類型的兼容性問題。

pickle用法:

語法概覽

Pickle 提供了幾個函數來處理序列化和反序列化:

  • pickle.dump(obj, file, protocol=None, *, fix_imports=True): 將對象 obj 序列化并寫入到文件對象 file 中。
  • pickle.dumps(obj, protocol=None, *, fix_imports=True): 將對象 obj 序列化并返回一個字節串。
  • pickle.load(file, *, fix_imports=True, encoding="ASCII", errors="strict"): 從文件對象 file 中讀取字節流并反序列化成 Python 對象。
  • pickle.loads(bytes_object, *, fix_imports=True): 從字節串 bytes_object 中讀取字節流并反序列化成 Python 對象。

其中,protocol 參數決定了使用的序列化協議版本,可以是以下之一:

  • pickle.HIGHEST_PROTOCOL: 使用最高的協議版本。
  • pickle.DEFAULT_PROTOCOL: 使用默認的協議版本。
  • 0: 表示原始協議。
  • 1: 表示文本模式。
  • 2: 表示二進制模式,更高效。

示例

序列化(Pickle)
import pickledata = {'name': 'Alice', 'age': 30, 'city': 'New York'}# 使用pickle.dumps將字典對象序列化為字節流
serialized_data = pickle.dumps(data)# 使用pickle.loads將字節流反序列化為原始對象
deserialized_data = pickle.loads(serialized_data)print(deserialized_data)
# 輸出: {'name': 'Alice', 'age': 30, 'city': 'New York'}# 使用pickle.dump將字典對象序列化并寫入文件
with open('data.pickle', 'wb') as file:pickle.dump(data, file)# 使用pickle.load從文件中讀取字節流并反序列化為原始對象
with open('data.pickle', 'rb') as file:loaded_data = pickle.load(file)print(loaded_data)
# 輸出: {'name': 'Alice', 'age': 30, 'city': 'New York'}

json的用法

語法概覽

json模塊中的主要函數和方法如下:

- `json.dumps(obj, indent=None)`

將Python對象`obj`編碼為JSON格式的字符串,并返回結果。如果指定了`indent`參數,它將定義縮進的級別,使得生成的JSON字符串具有更好的可讀性。

- `json.loads(json_str)`

將JSON格式的字符串`json_str`解碼為Python對象,并返回結果。

- `json.dump(obj, file, indent=None)`

將Python對象`obj`編碼為JSON格式的字符串,并將結果寫入文件對象`file`中。如果指定了`indent`參數,它將定義縮進的級別。

- `json.load(file)`

從文件對象`file`中讀取JSON格式的字符串,并將其解碼為Python對象。

示例

下面是一個簡單的示例,演示如何使用json模塊進行編碼和解碼:

import jsondata = {'name': 'Alice', 'age': 30, 'city': 'New York'}# 將Python對象編碼為JSON字符串
json_str = json.dumps(data)
print(json_str)
# 輸出: {"name": "Alice", "age": 30, "city": "New York"}# 將JSON字符串解碼為Python對象
decoded_data = json.loads(json_str)
print(decoded_data)
# 輸出: {'name': 'Alice', 'age': 30, 'city': 'New York'}# 將Python對象編碼為JSON字符串,并寫入文件
with open('data.json', 'w') as file:json.dump(data, file)# 從文件中讀取JSON字符串,并解碼為Python對象
with open('data.json', 'r') as file:loaded_data = json.load(file)print(loaded_data)
# 輸出: {'name': 'Alice', 'age': 30, 'city': 'New York'}

需要注意的是,JSON只支持一些基本數據類型,如字符串、數字、布爾值、列表、字典和None。Python對象中的其他類型,如函數、類實例和特殊對象,可能無法直接轉換為JSON字符串。可以使用`json.dump()`和`json.load()`函數配合自定義的編碼和解碼函數來處理這些特殊類型的對象。此外,json模塊還提供了格式化輸出、排序鍵、編碼和解碼的擴展選項,可以根據具體需求進行配置。

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

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

相關文章

實現多層感知機

目錄 多層感知機&#xff1a; 介紹&#xff1a; 代碼實現&#xff1a; 運行結果&#xff1a; 問題答疑&#xff1a; 線性變換與非線性變換 參數含義 為什么清除梯度&#xff1f; 反向傳播的作用 為什么更新權重&#xff1f; 多層感知機&#xff1a; 介紹&#xff1a;…

taocms 3.0.1 本地文件泄露漏洞(CVE-2021-44983)

前言 CVE-2021-44983 是一個影響 taoCMS 3.0.1 的遠程代碼執行&#xff08;RCE&#xff09;漏洞。該漏洞允許攻擊者通過上傳惡意文件并在服務器上執行任意代碼來利用這一安全缺陷。 漏洞描述 taoCMS 是一個內容管理系統&#xff08;CMS&#xff09;&#xff0c;用于創建和管…

持續集成的自動化之旅:Gradle在CI中的配置秘籍

持續集成的自動化之旅&#xff1a;Gradle在CI中的配置秘籍 引言 持續集成&#xff08;Continuous Integration, CI&#xff09;是現代軟件開發中的一項基礎實踐&#xff0c;它通過自動化的構建和測試流程來提高軟件質量和開發效率。Gradle作為一個靈活的構建工具&#xff0c;…

【眼疾病識別】圖像識別+深度學習技術+人工智能+卷積神經網絡算法+計算機課設+Python+TensorFlow

一、項目介紹 眼疾識別系統&#xff0c;使用Python作為主要編程語言進行開發&#xff0c;基于深度學習等技術使用TensorFlow搭建ResNet50卷積神經網絡算法&#xff0c;通過對眼疾圖片4種數據集進行訓練&#xff08;‘白內障’, ‘糖尿病性視網膜病變’, ‘青光眼’, ‘正常’&…

jenkins系列-05-jenkins構建golang程序

下載go1.20.2.linux-arm64.tar.gz 并存放到jenkins home目錄&#xff1a; 寫一個golang demo程序&#xff1a;靜態文件服務器&#xff1a;https://gitee.com/jelex/jenkins_golang package mainimport ("encoding/base64""flag""fmt""lo…

window下安裝go環境

一、go官網下載安裝包 官網地址如下&#xff1a;https://golang.google.cn/dl/ 選擇對應系統的安裝包&#xff0c;這里是window系統&#xff0c;可以選擇zip包&#xff0c;下載完解壓就可以使用 二、配置環境變量 這里的截圖配置以win11為例 我的文件解壓目錄是 D:\Software…

力扣32.最長有效括號

力扣32.最長有效括號 class Solution {public:int longestValidParentheses(string s) {int n s.size();int res0;int start -1;vector<int> st;for(int i0;i<n;i){if(s[i] ()st.push_back(i);else{//前面沒有( , (開啟下一段)下一段的開始更新為當前下標if(st.emp…

機器學習和人工智能在農業的應用——案例分析

作者主頁: 知孤云出岫 目錄 引言機器學習和人工智能在農業的應用1. 精準農業作物健康監測土壤分析 2. 作物產量預測3. 農業機器人自動化播種和收割智能灌溉 4. 農業市場分析價格預測需求預測 機器學習和人工智能帶來的變革1. 提高生產效率2. 降低生產成本3. 提升作物產量和質量…

Elsaticsearch java基本操作

索引 基本操作 package com.orchids.elasticsearch.web.controller;import cn.hutool.core.collection.CollUtil; import cn.hutool.json.JSONUtil; import com.orchids.elasticsearch.web.po.User; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOpe…

探索JT808協議在車輛遠程視頻監控系統中的應用

一、部標JT808協議概述 隨著物聯網技術的迅猛發展&#xff0c;智能交通系統&#xff08;ITS&#xff09;已成為現代交通領域的重要組成部分。其中&#xff0c;車輛遠程監控與管理技術作為ITS的核心技術之一&#xff0c;對于提升交通管理效率、保障道路安全具有重要意義。 JT8…

TensorBoard ,PIL 和 OpenCV 在深度學習中的應用

重要工具介紹 TensorBoard&#xff1a; 是一個TensorFlow提供的強大工具&#xff0c;用于可視化和理解深度學習模型的訓練過程和結果。下面我將介紹TensorBoard的相關知識和使用方法。 TensorBoard 簡介 TensorBoard是TensorFlow提供的一個可視化工具&#xff0c;用于&#x…

尚品匯-(十七)

目錄&#xff1a; &#xff08;1&#xff09;獲取價格信息 &#xff08;2&#xff09;獲取銷售信息 前面的表&#xff1a; &#xff08;1&#xff09;獲取價格信息 繼續編寫接口&#xff1a;ManagerService /*** 獲取sku價格* param skuId* return*/ BigDecimal getSkuPrice…

『 Linux 』匿名管道應用 - 簡易進程池

文章目錄 池化技術進程池框架及基本思路進程的描述組織管道通信建立的潛在問題 任務的描述與組織子進程讀取管道信息控制子進程進程退出及資源回收 池化技術 池化技術是一種編程技巧,一般用于優化資源的分配與復用; 當一種資源需要被使用時這意味著這個資源可能會被進行多次使…

mqtt.fx連接阿里云

本文主要是記述一下如何使用mqtt.fx連接在阿里云上創建好的MQTT服務。 1 根據MQTT填寫對應端口即可 找到設備信息&#xff0c;里面有MQTT連接參數 2 使用物模型通信Topic&#xff0c;注意這里的post說設備上報&#xff0c;那也就是意味著云端訂閱post&#xff1b;set則意味著設…

【輕松拿捏】Java-final關鍵字(面試)

目錄 1. 定義和基本用法 回答要點&#xff1a; 示例回答&#xff1a; 2. final 變量 回答要點&#xff1a; 示例回答&#xff1a; 3. final 方法 回答要點&#xff1a; 示例回答&#xff1a; 4. final 類 回答要點&#xff1a; 示例回答&#xff1a; 5. final 關鍵…

搭建hadoop+spark完全分布式集群環境

目錄 一、集群規劃 二、更改主機名 三、建立主機名和ip的映射 四、關閉防火墻(master,slave1,slave2) 五、配置ssh免密碼登錄 六、安裝JDK 七、hadoop之hdfs安裝與配置 1)解壓Hadoop 2)修改hadoop-env.sh 3)修改 core-site.xml 4)修改hdfs-site.xml 5) 修改s…

【進階篇-Day9:JAVA中單列集合Collection、List、ArrayList、LinkedList的介紹】

目錄 1、集合的介紹1.1 概念1.2 集合的分類 2、單列集合&#xff1a;Collection2.1 Collection的使用2.2 集合的通用遍歷方式2.2.1 迭代器遍歷&#xff1a;&#xff08;1&#xff09;例子&#xff1a;&#xff08;2&#xff09;迭代器遍歷的原理&#xff1a;&#xff08;3&…

排序——交換排序

在上篇文章我們詳細介紹了排序的概念與插入排序&#xff0c;大家可以通過下面這個鏈接去看&#xff1a; 排序的概念及插入排序 這篇文章就介紹一下一種排序方式&#xff1a;交換排序。 一&#xff0c;交換排序 基本思想&#xff1a;兩兩比較&#xff0c;如果發生逆序則交換…

jenkins系列-09.jpom構建java docker harbor

本地先啟動jpom server agent: /Users/jelex/Documents/work/jpom-2.10.40/server-2.10.40-release/bin jelexjelexxudeMacBook-Pro bin % sh Server.sh start/Users/jelex/Documents/work/jpom-2.10.40/agent-2.10.40-release/bin jelexjelexxudeMacBook-Pro bin % ./Agent.…

達夢數據庫的系統視圖v$sessions

達夢數據庫的系統視圖v$sessions 達夢數據庫&#xff08;DM Database&#xff09;是中國的一款國產數據庫管理系統&#xff0c;它提供了類似于Oracle的系統視圖來監控和管理數據庫。V$SESSIONS 是達夢數據庫中的一個系統視圖&#xff0c;用于顯示當前數據庫會話的信息。 以下…