【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)

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

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

相关文章

Ceph入门到精通-远程开发Windows下使用SSH密钥实现免密登陆Linux服务器

工具&#xff1a; win10、WinSCP 服务器生成ssh密钥&#xff1a; 打开终端&#xff0c;使账号密码登录&#xff0c;输入命令 ssh-keygen -t rsa Winscp下载 Downloading WinSCP-6.1.1-Setup.exe :: WinSCP window 生成密钥 打开powershell ssh-keygen -t rsa 注意路径 …

jenkins启动方式及上传html报告格式不正确解决方式

普通启动 1.首先进入jenkins所在目录找到jenkins.war 2.执行命令&#xff1a;nohup java -jar jenkins.war --httpPort80 >>log 2>&1 & nohup java -jar jenkins.war --httpPort8081 & #其中nohup和&是为了保证jenkins后台运行&#xff1b; #默…

JVM-运行时数据区

目录 什么是运行时数据区&#xff1f; 方法区 堆 程序计数器 虚拟机栈 局部变量表 操作数栈 动态连接 运行时常量池 方法返回地址 附加信息 本地方法栈 总结&#xff1a; 什么是运行时数据区&#xff1f; Java虚拟机在执行Java程序时&#xff0c;将它管…

第八次作业

一&#xff0c;.什么是数据认证&#xff0c;有什么作用&#xff0c;有哪些实现的技术手段? 数据认证是指保证数据的真实性、完整性和可信度&#xff0c;以确保数据不被篡改或伪造。其作用包括但不限于&#xff1a; 保护关键数据不被恶意篡改或损坏 提供数据来源的可靠性和安全…

2023华为od机试 Python【最多颜色的车辆】

前言 本题使用python解答,如果需要Java代码,参考点我 题目 在一个狭小的路口,每秒只能通过一辆车,假设车辆的颜色只有 3 种,找出 N 秒内经过的最多颜色的车辆数量。三种颜色编号为0 ,1 ,2 输入描述 第一行输入的是通过的车辆颜色信息。[0,1,1,2] 代表4 秒钟通过的车辆…

Excel表格(一)

1.单一栏的宽度和高度设置 2.大标题的跨栏居中 3.让单元格内的文字------自动适应 4.序号递增 5.货币符号 6.日期格式的选择 选到单元格&#xff0c;选中对应的日期格式 7.自动求和的计算 然后在按住回车键即可求出当前行的金额 点击自动求和 8.冻结表格栏 9.排序 1.单栏排序 …

拥抱AIGC浪潮,亚信科技将如何把握时代新增量?

去年底&#xff0c;由ChatGPT带起的AIGC浪潮以迅雷不及掩耳之势席卷全球。 当互联网技术的人口红利逐渐消退之际&#xff0c;AIGC就像打开通用人工智能大门的那把秘钥&#xff0c;加速开启数智化时代的到来。正如OpenAI CEO Sam Altman所言&#xff1a;一个全新的摩尔定律可能…

基于Spring Boot的医院预约挂号网站设计与实现(Java+spring boot+MySQL)

获取源码或者论文请私信博主 演示视频&#xff1a; 基于Spring Boot的医院预约挂号网站设计与实现&#xff08;Javaspring bootMySQL&#xff09; 使用技术&#xff1a; 前端&#xff1a;html css javascript jQuery ajax thymeleaf 微信小程序 后端&#xff1a;Java spring…

【设计模式】-代理模式

在软件开发中&#xff0c;经常遇到需要对某个对象进行控制或者监控的场景。而直接修改对象的代码可能使代码变得复杂且难以维护。这时&#xff0c;使用代理模式&#xff08;Proxy Pattern&#xff09;可以很好地解决这个问题。 代理模式是一种结构型设计模式&#xff0c;通过引…

MySql——数据库常用命令

一、关于数据库的操作 查看mysql中有哪些数据库 show databases;显示创建指定数据库MySQL语句 SHOW CREATE DATABASE 数据库名&#xff1a;使用指定数据库 use 数据库名;查看当前使用的是哪个数据库 select database();查看指定数据库下有哪些表 use 数据库名; -- 先选择…

k8s之Pod控制器

目录 一、Pod控制器及其功用二、pod控制器的多种类型2.1 pod容器中的有状态和无状态的区别 三、Deployment 控制器四、SatefulSet 控制器4.1 StatefulSet由以下几个部分组成4.2 为什么要有headless&#xff1f;4.3 为什么要有volumeClaimTemplate&#xff1f;4.4 滚动更新4.5 扩…

【LeetCode每日一题】——304.二维区域和检索-矩阵不可变

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 矩阵 二【题目难度】 中等 三【题目编号】 304.二维区域和检索-矩阵不可变 四【题目描述】 …

拦截器对接口细粒度权限校验

文章目录 一、逻辑分析二、校验规则1.规则类型2.规则划分3.规则配置信息4.规则案例说明5.规则加载 三、拦截器定义1.自定义拦截器2.注册拦截器 四、获取请求参数1.获取get提交方式参数2.获取post提交方式参数&#xff08;1&#xff09;定义RequestWrapper类&#xff08;2&#…

力扣:49. 字母异位词分组(Python3)

题目&#xff1a; 给你一个字符串数组&#xff0c;请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;力扣 示例&#xff1a; 示…

Linux基础:用tcpdump抓包

简介 网络数据包截获分析工具。支持针对网络层、协议、主机、网络或端口的过滤。并提供and、or、not等逻辑语句帮助去除无用的信息。 tcpdump - dump traffic on a network 例子 不指定任何参数 监听第一块网卡上经过的数据包。主机上可能有不止一块网卡&#xff0c;所以经常…

Java基础入门篇——自增自减运算符(八)

自增&#xff08;&#xff09;和自减&#xff08;--&#xff09;运算符在Java中用于增加或减少变量的值。这些运算符非常有用&#xff0c;特别是在循环和计数器中。 一、自增运算符&#xff08;&#xff09; 自增运算符将变量的值增加1。 前置自增&#xff1a;variable。先增…

地图 SDK gitlab 测试代码环境配置

文章目录 1、Gradle 插件版本和 Gradle 版本2、NDK 路径3、JDK 版本4、修改变量5、重新 BuildQ&A&#xff1a; test 用例启动之后问题问题描述 拉下项目的 dev 分支&#xff0c;然后依赖的 mapsdk-base 也完成下载 &#xff0c;之后就是Android Studio 配置环境 1、Gradle …

JDBC(常用类与接口、实现数据库的增删查改)

目录 1.Connection接口常用方法 2.DriverMange类 3.Statement接口 4.实现表的数据更新&#xff08;增、改、删&#xff09; 5.实现数据查找&#xff08;ResultSet接口&#xff09; 6.PreparedStatement 数据更新 1.Connection接口常用方法 用来与数据库连接的对象&#xff…

MediaCodec创建对应解码器

媒体编解码API使用示例 //获取相关格式文件的内容信息&#xff0c;如轨道数量、获取MIME信息、视频的高度与宽度、语言格式、播放总时长等 MediaExtractor mediaExtractor new MediaExtractor(); try {mediaExtractor.setDataSource(path); // 设置数据源 } catch (IOExcept…

apt、aptitude、apt-get/apt-cache语法的区别

apt句法 aptitude句法 apt-get/apt-cache语法 描述 apt update aptitude update apt-get update 更新包存档元数据 apt install foo ap