python 操作 json 文件的种种知识点

news2024/12/30 2:00:26

本篇博客将带你全方位了解 Python 操作 json 文件的技术点
让你碰到 json 格式文件不在发愁

文章目录

    • json 模块
      • 读取 JSON
      • 写入 JSON
      • 读取与写入基本用法如下
    • json 模块进阶用法
      • 控制输出格式
      • 在 JSON 中存储 Python 特殊类型
    • 对数据进行验证和清洗
    • 第三方模块

json 模块

Python 提供了内置的 json 模块来处理 JSON 格式的文件。

该模块主要分为读取和写入 JSON 文件。

读取 JSON

使用 json.load()json.loads() 方法来读取 JSON 文件。
其中 json.load() 方法用于读取文件中的 JSON 数据,json.loads() 方法用于读取字符串中的 JSON 数据。

写入 JSON

使用 json.dump()json.dumps() 方法来写入 JSON 文件。
其中 json.dump() 方法用于写入 JSON 数据到文件中,json.dumps() 方法用于将 JSON 数据转换为字符串

基于上述内容可以总结一下: json.load() , json.loads() , json.dump() json.dumps() 中的 s 都是字符串 string 的缩写。

读取与写入基本用法如下

提前准备一个 travel.json 文件,存放到 python 文件所在目录。


import json

# 读取json文件
with open('travel.json', 'r', encoding='utf-8') as f:
    data = json.load(f)

# 写入json文件
with open('travel.new.json', 'w', encoding='utf-8') as f:
    json.dump(data, f)

Tops:在使用 json.load()json.loads() 读取 json 文件时,如果文件中存在格式错误,会抛出 ValueError 异常。

json 模块进阶用法

控制输出格式

在处理 JSON 文件时,还可以使用 json.dump() 方法的可选参数来控制输出的格式,例如:

  • sort_keys:按照键的字典序排序输出。
  • indent:缩进输出,可以指定缩进的空格数。
import json

# # 读取json文件
with open('travel.json', 'r', encoding='utf-8') as f:
    data = json.load(f)


with open('travel.new.json', 'w', encoding='utf-8') as f:
    json.dump(data, f, sort_keys=True, indent=4)

此时可以比对旧文件与新文件之间的差异,可以看到缩进关系产生了变化。

python 操作 json 文件的种种知识点

在 JSON 中存储 Python 特殊类型

如果你要在 json 中存储 python 特殊类型,例如 datetime,需要使用 json.JSONEncoder 类和 json.JSONDecoder 类来处理。


import json
from datetime import datetime

# 日期编码
class DateEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, datetime):
            return obj.strftime('%Y-%m-%d %H:%M:%S')
        return json.JSONEncoder.default(self, obj)


d = {'date': datetime.now()}
json_str = json.dumps(d, cls=DateEncoder)
print(json_str)

# 日期解码
class DateDecoder(json.JSONDecoder):
    def __init__(self):
        json.JSONDecoder.__init__(self, object_hook=self.dict_to_object)

    def dict_to_object(self, d):
        if 'date' in d:
            d['date'] = datetime.strptime(d['date'], '%Y-%m-%d %H:%M:%S')
        return d


data = json.loads(json_str, cls=DateDecoder)

print(data)

运行代码,可以得到编码和解码的输出。

{"date": "2023-01-27 21:24:46"}
{'date': datetime.datetime(2023, 1, 27, 21, 24, 46)}

对数据进行验证和清洗

JSON Schema 是一种用于验证 JSON 文档的标准,它可以用来确保 JSON 文档符合预期的格式。

jsonschema 模块需要提前安装,示例代码如下。

import json
import jsonschema

schema = {
    "type": "object",
    "properties": {
        "name": {"type": "string"},
        "age": {"type": "number"}
    },
    "required": ["name", "age"]
}

data = '{"name": "梦想橡皮擦", "age": 28}'

try:
    jsonschema.validate(json.loads(data), schema)
    print("可用的JSON")
except jsonschema.exceptions.ValidationError as e:
    print(e)

当你的 json 格式正确时,会输出相应的内容,输出错误信息,测试代码可以将 "required": ["name", "age"] 修改为 "required": ["name", "age" , "sex"]

第三方模块

在处理 JSON 格式文件时还可以使用第三方库来更方便地操作,例如 pandas。

import pandas as pd

# 读取json文件
data = pd.read_json('travel.json')

# 写入json文件
data.to_json('travel.pandas.json')

还有其他第三方库也可以用来处理 JSON 格式文件,例如:

  • ijson:迭代读取大型 JSON 文件。
  • jsonpickle:支持将 Python 对象序列化为 JSON 格式。
  • jsonlines:简单而高效地读取和写入文本文件中的 JSON 数据。
  • simplejson:提供了一种比标准库更快的 JSON 解析器和生成器。
  • json-tricks:支持一些高级功能,例如压缩和迭代。

📢📢📢📢📢📢
💗 你正在阅读 【梦想橡皮擦】 的博客
👍 阅读完毕,可以点点小手赞一下
🌻 发现错误,直接评论区中指正吧
📆 橡皮擦的第 848 篇原创博客

全网 6000+人正在学习的 爬虫专栏 👇👇👇👇

  • ⭐️ Python 爬虫 120,点击订购 ⭐️
  • ⭐️ 爬虫 100 例教程,点击订购 ⭐️

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/181232.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CE自动汇编之AOB注入

目录 一、什么是AOB注入? 二、什么时候使用AOB注入? 三、代码注入 四、全部注入 五、“全部注入”和“AOB注入”的分别 六、代码注入与AOB注入的区别 CE自动汇编的模板中,有三种注入代码的方式: 第一种是代码注入&#xff…

Qt使用数据库模型中的删除详解

以下使用 QSqlTableModel 模型,使用tableView显示内容 以下为界面: 这里主要介绍删除操作: 删除一行为: int rowui->tableView->currentIndex().row();//获取行号model->revertRow(row);//删除该行model->submitAll(…

git 关于分支和仓库的理解

何时需要initgit init//初始化本地仓库.git目录如果初始化就会在当前文件夹中出现.git的目录,该目录默认是隐藏的,需要关闭显示隐藏文件才能看到。执行完git init命令后,当前目录就成为了工作区(工作区可以理解为操作本地仓库的车…

MyBatis-Plus知识快速入门

文章目录1.MyBatis-Plus简介2.入门案例2.1开发环境2.2创建测试数据库和表2.3创建SpringBoot工程2.4创建实体类以及lombok的使用2.5添加mapper2.6加入日志功能3.基本的CRUD3.1BaseMapper3.2插入3.3删除3.4修改3.5查询4.通用Service4.1创建Service接口和实现类5.常用注解5.1Table…

“华为杯”研究生数学建模竞赛2005年-【华为杯】A题:城市出租车交通规划综合模型(附获奖论文和matlab代码)

赛题描述 A: Highway Traveling time Estimate and Optimal Routing Ⅰ Highway traveling time estimate is crucial to travelers. Hence, detectors are mounted on some of the US highways. For instance, detectors are mounted on every two-way six-lane highways o…

springboot 分布式全局唯一id的生成-雪花算法snowflake

一 背景描述 1.1 问题产生 在分布式系统中,怎么使用全局唯一id? 在分布式是,微服务的架构中,或者大数据分库分表中,多个不同节点怎么保持每台机器生成的主键id不重复,具有唯一性? 方案1&…

【算法基础】归并排序(原理、过程、例题、代码)

一、归并排序原理 1. 算法介绍 归并排序是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有…

力扣 2309. 兼具大小写的最好英文字母

题目 给你一个由英文字母组成的字符串 s ,请你找出并返回 s 中的 最好 英文字母。返回的字母必须为大写形式。如果不存在满足条件的字母,则返回一个空字符串。 最好 英文字母的大写和小写形式必须 都 在 s 中出现。 英文字母 b 比另一个英文字母 a 更…

前端食堂技术周刊第 68 期:Astro 2.0、Nuxt v3.1.0、Bun v0.5、TS 实现 Stage 3 Decorators 提案

美味值:🌟🌟🌟🌟🌟 口味:萝卜牛腩煲 食堂技术周刊仓库地址:https://github.com/Geekhyt/weekly 本期摘要 Astro 2.0Nuxt v3.1.0Bun v0.5TS 实现 Stage 3 Decorators 提案Turbore…

【算法突击】排序算法系列(一) | 程序员面试 | 冒泡排序 | 快速排序 | 归并排序

【排序算法】 冒泡排序 | 快速排序 | 归并排序 文章目录【排序算法】 冒泡排序 | 快速排序 | 归并排序1. 冒泡排序1.1 核心思想1.2 代码实现2. 快速排序2.1 核心思想2.2 时间复杂度2.2 代码实现3. 归并排序3.1 核心思想3.2 时间复杂度3.3 代码实现1. 冒泡排序 1.1 核心思想 将…

【接口自动化】接口间参数传递的一种解决方案

本文转载自:接口间参数传递的一种解决方案 做过接口自动化测试的同学肯定都熟悉在全链路测试过程中,很多业务场景的完成并非由单一接口实现,而是由很多接口组成的一条链路实现。例如你在淘宝上购物场景。 不同于单接口测试,这种链…

2 线性模型

文章目录一般流程问题引入数据集与测试集过拟合与泛化开发集监督学习和非监督学习问题分析训练集、验证集、测试集模型设计模拟训练过程课程代码课后习题代码课程来源: 链接文档参考: 链接以及 BirandaのBlog!一般流程 对于一般的线性模型来…

微信小程序 Springboot校园招聘求职系统

基于微信小程序的校园求职系统的设计基于现有的手机,可以实现首页、个人中心、岗位类型管理、用户管理、企业管理、招聘信息管理、应聘信息管理、系统管理等功能。方便用户对首页、招聘信息、我的等详细的了解及统计分析 一个基本的程序包含app.json、project.confi…

谈谈SpringBoot(二)

1. Spring Boot缓存 1.1 JSR-107 Spring从3.1开始定义了org.springframework.cache.Cache 和org.springframework.cache.CacheManager接口来统一不同的缓存技术; 并支持使用JCache(JSR-107)注解简化我们开发。 Cache接口为缓存的组件规范定义…

day23|93.复原IP地址、78.子集、90.子集II

93.复原IP地址 有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 . 分隔。 例如:"0.1.2.201" 和 "192.168.1.1" 是 有效 IP 地址,但是 &q…

layui框架学习(2:颜色、图标、动画)

B站教学视频中对Layui的颜色没有专门介绍,而Layui官方教程中虽然有颜色章节,但也只是简单介绍了基色调、辅色调、中性的颜色的概念及用途,最后说明layui 内置了七种背景色,以便用于各种元素中,如:徽章、分割…

Go语言基础入门第二章

Go语言环境安装 下载地址:https://golang.google.cn/dl/ 下载完安装包直接安装即可,安装完毕后,打开cmd控制台,输入”go version“查看是否安装成功以及对应安装版本。 配置环境变量Go语言需要一个安装目录,还需要一个…

Spring Cloud_Eureka服务注册与发现

目录一、Eureka基础知识1.什么是服务治理2.什么是服务注册3.Eureka两组件二、单机Eureka构建步骤1.IDEA生成eurekaServer端服务注册中心2.服务提供者3.服务消费者代码链接 https://github.com/lidonglin-bit/cloud 一、Eureka基础知识 1.什么是服务治理 SpringCloud封装了Ne…

金融风控09

迁移学习 为什么要? 源域样本与目标域样本分布有区别,目标域样本量不够 平时建模用的迁移学习场景 1、新开某个消费分期场景样本量少,需要用其他场景的数据建模 2、业务被迫停滞3个月再重启,大部分训练样本比较老旧&#xff…

含分布式光伏的配电网集群划分和集群电压协调控制(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…