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.mzph.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;用于显示当前数据库会话的信息。 以下…