当前位置: 首页 > news >正文

【100天精通python】Day28:文件与IO操作_JSON文件处理

 目录 

专栏导读 

1. JSON数据格式简介

1.1 示例JSON数据

1.2 JSON文件的特点 

2 json模块的常用操作

2.1 读写JSON文件的示例

2.2 解析JSON字符串

2.3 修改JSON数据

 2.4 查询和操作嵌套数据

2.5 处理包含特殊字符的JSON文件

2.6 处理日期和时间 

2.7 处理大型JSON文件

2.8 格式化输出

2.9 处理嵌套结构和深层次的JSON

2.10 JSON文件读取失败如何处理

3 json 文件格式转换

3.1 JSON转换为CSV

3.2 JSON转换为XML

3. 3 JSON转换为YAML

3.4 CSV/XML/YAML转换为JSON

4 CSV/XML/YAML转换为JSON

4.1 CSV转换为JSON

4.2 XML转换为JSON

4.3 YAML转换为JSON


专栏导读 

专栏订阅地址:https://blog.csdn.net/qq_35831906/category_12375510.html

1. JSON数据格式简介

        JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛用于数据的存储和交流。它易于人类阅读和编写,同时也易于机器解析和生成。JSON的主要特点包括:

        基本结构:JSON由键值对构成,键和值之间使用冒号分隔,不同的键值对之间使用逗号分隔。JSON的数据结构可以嵌套,从而构建出复杂的数据结构。 

        数据类型:JSON支持多种数据类型,包括:

  • 对象(Object):由花括号 {} 包裹,包含键值对,键是字符串,值可以是字符串、数字、布尔值、对象、数组等。
  • 数组(Array):由方括号 [] 包裹,包含多个值,值可以是字符串、数字、布尔值、对象、数组等。
  • 字符串(String):使用双引号 " 包裹,可以包含任何Unicode字符。
  • 数字(Number):可以是整数或浮点数。
  • 布尔值(Boolean):表示真或假。
  • 空值(Null):表示空值或缺失数据。

1.1 示例JSON数据

{"name": "John","age": 30,"is_student": false,"hobbies": ["reading", "swimming"],"address": {"street": "123 Main St","city": "Cityville"}
}

1.2 JSON文件的特点 

  1. 易于阅读:JSON的结构清晰,容易阅读和理解,适用于人类和机器之间的交互。

  2. 跨平台性:JSON是一种与编程语言和平台无关的格式,因此适用于不同语言和操作系统之间的数据交换。

  3. 用途广泛:JSON在网络传输、配置文件、API交互、日志记录等领域都有广泛的应用。

JSON的简洁性和可读性使其成为当今应用程序和系统之间数据交换的首选格式之一。无论是在前端和后端的开发中,还是在数据处理和存储中,都可以使用JSON来方便地表示和传递数据。

2 json模块的常用操作

  json模块提供了两个主要函数:json.dumps()用于将Python对象转换为JSON格式的字符串,json.loads()用于将JSON格式的字符串解析为Python对象。此外,还有用于读写JSON文件的函数:json.dump()用于将Python对象写入JSON文件,json.load()用于从JSON文件读取数据并将其转换为Python对象。

2.1 读写JSON文件的示例

        下面是一个简单的示例,演示如何使用json模块读写JSON文件:

import json# 要写入JSON文件的数据
data = {"name": "Alice","age": 25,"is_student": True,"hobbies": ["painting", "gardening"],"address": {"street": "456 Elm St","city": "Townsville"}
}# 将数据写入JSON文件
with open("data.json", "w") as json_file:json.dump(data, json_file, indent=4)  # indent用于美化输出# 从JSON文件读取数据
with open("data.json", "r") as json_file:loaded_data = json.load(json_file)# 打印读取的数据
print(loaded_data)

        在这个示例中,我们首先将一个Python字典写入名为"data.json"的JSON文件中,然后再从该文件中读取数据并将其加载为Python对象。加载的数据与原始数据相同,以字典的形式存储在loaded_data变量中。

2.2 解析JSON字符串

使用json.loads()函数可以将JSON格式的字符串解析为Python字典或列表。

import jsonjson_string = '{"name": "Bob", "age": 30}'
data = json.loads(json_string)

2.3 修改JSON数据

读取JSON数据后,你可以对其进行修改,然后再写回JSON文件。

import jsonwith open("data.json", "r") as json_file:data = json.load(json_file)# 修改数据
data["age"] = 28with open("data.json", "w") as json_file:json.dump(data, json_file, indent=4)

 2.4 查询和操作嵌套数据

当JSON数据有嵌套结构时,你可以使用字典或列表的方式查询和操作内部数据。

import jsonwith open("data.json", "r") as json_file:data = json.load(json_file)# 查询嵌套数据
city = data["address"]["city"]
hobbies = data["hobbies"]# 修改嵌套数据
data["address"]["city"] = "New City"
data["hobbies"].append("cooking")

2.5 处理包含特殊字符的JSON文件

有时,JSON文件中可能包含特殊字符(如Unicode转义字符)或不可打印字符。在读取和处理这些文件时,你可能需要进行解码和处理。

import jsonwith open("special_chars.json", "r", encoding="utf-8") as json_file:raw_data = json_file.read()cleaned_data = raw_data.encode("utf-8").decode("unicode_escape")parsed_data = json.loads(cleaned_data)
print(parsed_data)

2.6 处理日期和时间 

import json
from datetime import datetimedata_with_dates = {"event": "birthday","date": "2023-08-07T15:30:00Z"
}date_string = data_with_dates["date"]
parsed_date = datetime.strptime(date_string, "%Y-%m-%dT%H:%M:%SZ")
print(parsed_date)

2.7 处理大型JSON文件

对于大型JSON文件,可能需要逐行读取和处理,以减少内存占用。

import jsonwith open("large_data.json", "r") as json_file:for line in json_file:data = json.loads(line)# 处理每一行的数据

2.8 格式化输出

使用json.dump()时,可以设置indent参数来美化输出,使其更易读。

import jsondata = {"name": "Alice","age": 25,"hobbies": ["painting", "gardening"]
}with open("output.json", "w") as json_file:json.dump(data, json_file, indent=4)

2.9 处理嵌套结构和深层次的JSON

        当JSON数据具有深层次的嵌套结构时,访问和处理特定数据可能变得复杂。你可以使用递归方法来处理深层次的嵌套结构。

def get_value(data, target_key):if isinstance(data, dict):for key, value in data.items():if key == target_key:return valueif isinstance(value, (dict, list)):result = get_value(value, target_key)if result is not None:return resultelif isinstance(data, list):for item in data:result = get_value(item, target_key)if result is not None:return resultreturn None# 示例JSON数据
nested_data = {"person": {"name": "Alice","address": {"street": "123 Elm St","city": "Townsville"}}
}target_value = get_value(nested_data, "city")
print(target_value)  # 输出:Townsville

2.10 JSON文件读取失败如何处理

 无法成功读取JSON文件内容,导致json.load()函数报错。

确保文件路径正确,文件存在且可读。检查文件编码是否正确,通常使用utf-8编码。

import jsontry:with open("data.json", "r", encoding="utf-8") as json_file:data = json.load(json_file)
except FileNotFoundError:print("JSON file not found.")
except json.JSONDecodeError:print("Error decoding JSON data.")

3 json 文件格式转换

3.1 JSON转换为CSV

        CSV(Comma-Separated Values)是一种以逗号分隔字段的文本文件格式。你可以使用Python的csv模块将JSON数据转换为CSV格式。

import json
import csvwith open("data.json", "r") as json_file:data = json.load(json_file)with open("data.csv", "w", newline="") as csv_file:csv_writer = csv.writer(csv_file)# 写入表头csv_writer.writerow(data[0].keys())# 写入数据for item in data:csv_writer.writerow(item.values())

3.2 JSON转换为XML

        XML(eXtensible Markup Language)是一种标记语言,用于表示结构化数据。你可以使用Python的第三方库(如xmltodict)将JSON数据转换为XML格式。

import json
import xmltodictwith open("data.json", "r") as json_file:data = json.load(json_file)xml_data = xmltodict.unparse({"root": data})
with open("data.xml", "w") as xml_file:xml_file.write(xml_data)

3. 3 JSON转换为YAML

        YAML(YAML Ain't Markup Language)是一种可读性高的数据序列化格式。你可以使用Python的pyyaml库将JSON数据转换为YAML格式。

import json
import yamlwith open("data.json", "r") as json_file:data = json.load(json_file)with open("data.yaml", "w") as yaml_file:yaml.dump(data, yaml_file, default_flow_style=False)

3.4 CSV/XML/YAML转换为JSON

        同样地,你可以将CSV、XML和YAML文件转换为JSON格式,具体方法取决于所用的库。例如,使用csvxmltodictpyyaml等库可以进行相应的转换。

4 CSV/XML/YAML转换为JSON

4.1 CSV转换为JSON

import csv
import jsoncsv_file_path = "data.csv"
json_file_path = "data_from_csv.json"data = []with open(csv_file_path, "r") as csv_file:csv_reader = csv.DictReader(csv_file)for row in csv_reader:data.append(row)with open(json_file_path, "w") as json_file:json.dump(data, json_file, indent=4)

4.2 XML转换为JSON

假设你有一个XML文件 data.xml

<root><item><name>John</name><age>30</age></item><item><name>Alice</name><age>25</age></item>
</root>

下面是将XML转换为JSON的示例代码:

import xmltodict
import jsonxml_file_path = "data.xml"
json_file_path = "data_from_xml.json"with open(xml_file_path, "r") as xml_file:xml_data = xml_file.read()json_data = json.dumps(xmltodict.parse(xml_data), indent=4)with open(json_file_path, "w") as json_file:json_file.write(json_data)

4.3 YAML转换为JSON

假设你有一个YAML文件 data.yaml

- name: Johnage: 30
- name: Aliceage: 25

下面是将YAML转换为JSON的示例代码:

import yaml
import jsonyaml_file_path = "data.yaml"
json_file_path = "data_from_yaml.json"with open(yaml_file_path, "r") as yaml_file:yaml_data = yaml.safe_load(yaml_file)json_data = json.dumps(yaml_data, indent=4)with open(json_file_path, "w") as json_file:json_file.write(json_data)

相关文章:

【100天精通python】Day28:文件与IO操作_JSON文件处理

目录 专栏导读 1. JSON数据格式简介 1.1 示例JSON数据 1.2 JSON文件的特点 2 json模块的常用操作 2.1 读写JSON文件的示例 2.2 解析JSON字符串 2.3 修改JSON数据 2.4 查询和操作嵌套数据 2.5 处理包含特殊字符的JSON文件 2.6 处理日期和时间 2.7 处理大型JSON文…...

配置两台数据库为主从数据库模式

一、主库配置 1、修改配置文件 /etc/my3306.cnf #mysql服务ID&#xff0c;保证整个集群环境中唯一&#xff0c;默认为1server-id1#是否只读&#xff0c;1代表只读&#xff0c;0代表读写read-only0#忽略的数据&#xff0c;指不需要同步的数据库#binlog-ignore-dbmysql#指定同步…...

linux允许root远程ssh登录

修改文件/etc/ssh/sshd_config # cat /etc/ssh/sshd_config ... #LoginGraceTime 2m #PermitRootLogin prohibit-password #StrictModes yes #MaxAuthTries 6 #MaxSessions 10 ...将 #PermitRootLogin prohibit-password标注为&#xff1a; PermitRootLogin yes样例&#xf…...

Baumer工业相机堡盟工业相机如何通过BGAPISDK获取相机接口数据吞吐量(C++)

Baumer工业相机堡盟工业相机如何通过BGAPISDK里函数来获取相机当前数据吞吐量&#xff08;C&#xff09; Baumer工业相机Baumer工业相机的数据吞吐量的技术背景CameraExplorer如何查看相机吞吐量信息在BGAPI SDK里通过函数获取相机接口吞吐量 Baumer工业相机通过BGAPI SDK获取数…...

Spring @Scheduled单线程单实例的坑

文章目录 前言背景验证解决方案 前言 在 Java Spring 项目中经常会用 Scheduled 来实现一些定时任务的场景&#xff0c;有必要了解一些它使用时的问题和内部实现机制。本文是偶然间发现的一个问题&#xff0c;刷新了我的认知&#xff0c;分享给大家。 其他相关文章&#xff1…...

7-数据结构-(带头节点)单链表的增删改查

问题&#xff1a; 单链表带头结点的创建以及输出&#xff0c;以及带与不带头节点的区别 思路&#xff1a; 单链表&#xff0c;逻辑上是线性结构&#xff0c;由许多单链表结点&#xff0c;串成一串。其单链表结构体中&#xff0c;数据项由data数据域和结点指针域。带头节点是为…...

每天一道leetcode:剑指 Offer 53 - II. 0~n-1中缺失的数字(适合初学者二分查找)

今日份题目&#xff1a; 一个长度为n-1的递增排序数组中的所有数字都是唯一的&#xff0c;并且每个数字都在范围0&#xff5e;n-1之内。在范围0&#xff5e;n-1内的n个数字中有且只有一个数字不在该数组中&#xff0c;请找出这个数字。 示例1 输入: [0,1,3] 输出: 2 示例2 …...

玩机搞机---安卓新机型payload.bin刷写救砖 无需专用线刷包

目前的新机型官方卡刷包解包后都是payload.bin分区格式的卡刷固件。而有个别一些机型没有线刷包&#xff0c;当这些机型出现系统问题的时候有以下几种方法参考救砖。遇到类似故障的朋友可以借鉴参考下. 其中的不足和相关的资源可以参考这两个博文。任何教程的目的只是拓展你的…...

配置固定二级子域名远程访问内网群晖NAS 7.X版 【内网穿透】——“cpolar内网穿透”

配置固定二级子域名远程访问内网群晖NAS 7.X版 【内网穿透】 文章目录 配置固定二级子域名远程访问内网群晖NAS 7.X版 【内网穿透】前言1. 创建一条固定数据隧道2. 找到“保留二级子域名”栏位3. 重新编辑之前建立的临时数据隧道4. 进入“在线隧道列表”页面5. 在其他浏览器访问…...

【枚举】CF1706 C

有人一道1400写了一个小时 Problem - C - Codeforces 题意&#xff1a; 思路&#xff1a; 首先先去观察样例&#xff1a; 很显然&#xff0c;对于n是奇数的情况&#xff0c;只有一种情况&#xff0c;直接操作偶数位就好了 主要是没搞清楚n是偶数的情况 其实有个小技巧&…...

uniapp-疫情应急管理系统学生端

1 疫情资讯展示 <template><view class"container"><uni-section title"自定义卡片内容" type"line"><uni-card title"基础卡片" class"card-box" v-for"(item,index) in epidemicNewsList"…...

FreeRTOS的线程间通信

一、分类 FreeRTOS的线程间通信分为这几大类 由于我还在学习中&#xff0c;目前显从信号开始记录学习 二、逐块讲解 1、信号&#xff08;osSignalWait osSignalSet&#xff09; FreeRTOS从V8.2.0版本开始提供任务通知这个功能&#xff0c;每个任务多有一个32位的通知值&am…...

Linux内存管理工作原理:

Linux使用虚拟内存和内存映射来管理内存。每个进程都有独立的虚拟地址空间&#xff0c;通过将虚拟地址映射到物理内存&#xff0c;实现对内存的管理和访问。 虚拟地址空间划分&#xff1a;32位系统中&#xff0c;内核空间占1GB&#xff0c;用户空间占3GB&#xff1b;64位系统中…...

【并发编程】ShenyuAdmin里面数据同步用到的无锁环形队列LMAX Disruptor并发框架

并发&#xff0c;数据同步往往是业务开发中比较重要的部分。 shenyu网关数据同步设计方案图 shenyu官网给出的同步设计方案图如下&#xff1a; 基于事件异步并发框架com.lmax.disruptor 下载下示例代码&#xff0c;跑起来发现&#xff0c;在shenyuAdmin模块里面用到了com.lma…...

Nginx(2)

目录 1.安装Nginx1.yum安装2.编译安装3.Nginx命令 2.配置文件详解 1.安装Nginx 1.yum安装 [rootdocker ~]# yum -y install nginx通过 rpm -ql nginx 查看安装信息 2.编译安装 2.1安装所需要的依赖 yum install -y gcc gcc-c make libtool wget pcre pcre-devel zlib zlib-…...

二维数组的鞍点

描述 给定一个二维数组&#xff0c;找出其中的鞍点。若存在鞍点&#xff0c;则输出其位置&#xff1b;否则输出“NO”。 鞍点的定义&#xff1a;在一个矩阵的行和列中&#xff0c;某个元素是所在行的最大值&#xff0c;而同列中又是最小值。 输入 输入包含多行&#xff0c;…...

go 内置函数copy()

go内置函数copy go 内置函数copy()函数说明&#xff1a;代码例子1&#xff1a;代码例子2&#xff1a;代码例子3&#xff1a; go 内置函数copy() 函数说明&#xff1a; 当我们在Go语言中需要将一个切片的内容复制到另一个切片时&#xff0c;可以使用内置的copy()函数。copy()函…...

Spring简述

Sping是什么Spring主要模块IOCDI依赖注入的三种方式 AOP术语 Sping是什么 Spring是一个轻量级的开源框架&#xff0c;主要作用是为了简化开发&#xff0c;它以IOC&#xff08;控制反转&#xff09;和AOP&#xff08;面向切面编程&#xff09;为内核 Spring主要模块 我们一般…...

框框大学之——教育技术学

清一色劝退的教育技术学。。。。。。 https://www.kkdaxue.com/?current1&major%E6%95%99%E8%82%B2%E6%8A%80%E6%9C%AF%E5%AD%A6&pageSize10&sortFieldcreateTime&sortOrderdescend 总结&#xff1a; 1 杂而不经 2 摆烂劝退居多 3 适合躺平 4 考公不行 5 要多…...

Android中的Apk 包体优化

Android中的Apk 包体优化 在Android中&#xff0c;APK包体优化指的是减小应用程序的安装包大小&#xff0c;以降低用户下载和安装应用的成本&#xff0c;提高用户体验。APK包体优化对于应用的性能、启动速度和用户留存率都有着重要的影响。下面展开说说一些常见的APK包体优化策…...

Java基础接口详解

Java基础接口详解 ​ 文末附上下载详解pdf链接 ​ 实现java代码中接口详细分析 Java基础接口是一种定义了一组方法签名但没有提供实际实现的抽象类似的结构。它们允许类通过实现接口来声明自己拥有某些特定的行为。接口在Java中扮演了重要的角色&#xff0c;以下是一些关键点…...

CCL 2023 电信网络诈骗案件分类评测-第一名方案

1 任务内容 1.1 任务背景 2022年12月1日起&#xff0c;新出台的《反电信网络诈骗犯罪法》正式施行&#xff0c;表明了我国治理当前电信网络诈骗乱象的决心。诈骗案件分类问题是打击电信网路诈骗犯罪过程中的关键一环&#xff0c;根据不同的诈骗方式、手法等将其分类&#xff…...

go test

关于go test 报错 command-line-arguments go test 直接调用被测试go文件方法时候报错 command-line-arguments [command-line-arguments.test]&#xff0c;这里已经明确指出了命令参数问题 PS E:\code\mqtt> go test .\client_test.go # command-line-arguments [comma…...

401 · 排序矩阵中的从小到大第k个数

链接&#xff1a;LintCode 炼码 - ChatGPT&#xff01;更高效的学习体验&#xff01; 题解&#xff1a; 九章算法 - 帮助更多程序员找到好工作&#xff0c;硅谷顶尖IT企业工程师实时在线授课为你传授面试技巧 class Solution { public:/*** param matrix: a matrix of intege…...

进程什么时候会进入阻塞状态

等待I/O操作&#xff1a;当进程需要进行输入/输出操作&#xff0c;但是所需的数据还没有准备好或者输出设备还没有空闲时&#xff0c;进程会进入阻塞状态&#xff0c;等待I/O操作完成。 等待资源&#xff1a;当进程需要访问共享资源&#xff0c;但是该资源已经被其他进程占用时…...

炸裂,靠“吹牛”过京东一面,月薪40K

说在前面 在40岁老架构师尼恩的&#xff08;50&#xff09;读者社区中&#xff0c;经常有小伙伴&#xff0c;需要面试美团、京东、阿里、 百度、头条等大厂。 下面是一个5年小伙伴成功拿到通过了京东一面面试&#xff0c;并且最终拿到offer&#xff0c;月薪40K。 现在把面试…...

awk基础知识和案例

文章目录 awk1 awk用法入门1.1 BEGIN和END语句块1.2 awk语法1.2.1 常用命令选项1.2.2 awk变量内置变量自定义变量 1.3 printf命令1.3.1 格式1.3.2 演示 1.4 操作符 2 awk高阶用法2.1 awk控制语句(if-else判断)2.2 awk控制语句(while循环)2.3 awk控制语句(do-while循环)2.4 awk控…...

重型并串式液压机械臂建模与simscape仿真

一、建模 Hydraulic manipulator Figure 1 shows different constituting parts of the manipulator considered, with every part labeled using numbers from 1 to 10. For each part, a CAD model is provided. Each file is named in accordance with the corresponding la…...

zookeeper的部署

一 先下载zookeeper 二 解压包 三 修改配置文件 四 把配好文件传到其他的节点上面 五 在每个节点的dataDir指定的目录下创建一个 myid 的文件 六 配置zook的启动脚本 七 设置开机自启 八 分别启动 九查看当前状态service zookeeper status 十 总结 一 先下载zookeeper …...

css white-space属性

先看不换行的效果&#xff0c;调用.space类 再来看使用 white-space:nowrap的效果 运行结果如下&#xff1a;...