Python 从文件中读取JSON 数据并解析转存


文章目录

      • 文章开篇
      • Json简介
      • Json数据类型
      • Json硬性规则
      • Json数据转化网站
      • Json和Dict类型转换
      • json模块的使用
      • Python数据和Json数据的类型映射
      • json.dumps
        • 1.字典数据中含有**存在中文**
        • 2.json数据通过缩进符**美观输出**
        • 3.对Python数据类型中键进行**排序输出**
        • 4.json数据**分隔符的控制**
      • json.dump
      • json.loads
      • json.load
      • Json和非Dict类型数据转换
        • 1.元祖转换
        • 2.列表转换
        • 3.布尔值转换
        • 4.数值转换
      • 案例应用
        • 1.JSON数据的合并与去重
        • 2.JSON数据的动态查询与过滤
      • 总结

文章开篇

Python的魅力,犹如星河璀璨,无尽无边;人生苦短、我用Python!


Json简介

在这里插入图片描述

JSON(JavaScript Object Notation)数据是一种轻量级的数据交换格式
JSON数据使用键值对的方式来组织数据,其中键是字符串,值是字符串、数字、布尔值、数组、对象或null
由于JSON数据格式简单且易于解析,它已成为现代应用程序中常用的数据格式之一,特别是在Web应用程序和移动应用程序中进行数据交换时,JSON数据被广泛使用。


Json数据类型

在JSON(JavaScript Object Notation)语言中,存在六种基本数据类型

  • 字符串(String):由零个或多个字符组成的有序字符序列,用于表示文本信息;
  • 数字(Number):可以是整数或浮点数,用于表示数值信息;
  • 布尔值(Boolean):只有两个取值,true 或 false,用于表示逻辑状态;
  • 数组(Array):有序的值的集合,每个值可以是一个数据类型或另一个数组,用于表示列表或集合;
  • 对象(Object):无序的键值对集合,其中每个键都是一个字符串,每个值可以是任意数据类型,用于表示复杂的数据结构;
  • null:表示空值或不存在的值

这些数据类型可以单独使用,也可以组合起来创建更复杂的数据结构
例如,一个对象可以包含多个键值对,其中值可以是字符串、数字、布尔值、数组或另一个对象;
同样,数组可以包含任意数量的元素,每个元素都可以是任意数据类型;
这种灵活性和组合性使得JSON成为一种强大且通用的数据交换格式;


Json硬性规则

  • 在JSON语言中,字符集的使用被严格限定为UTF-8。这是因为UTF-8编码能够支持全球范围内的字符集,确保了JSON数据的跨语言、跨平台兼容性;
  • 为了确保JSON数据的解析一致性和准确性,JSON标准规定字符串的界定符必须是双引号(“”)。这意味着在JSON中,所有的字符串都必须用双引号括起来,而不能使用单引号或其他字符;

Json数据转化网站

  • **json.cn:**https://www.json.cn/
  • **kjson:**https://www.kjson.com/
  • **json菜鸟工具:**https://c.runoob.com/front-end/53
  • **sojson:**https://www.sojson.com/ 非常全的json处理网站
  • **编程狮-json检验工具:**https://www.w3cschool.cn/tools/index?name=jsoncheck
  • **JSONViewer:**http://jsonviewer.stack.hu/ 用于检测Json格式是否正确的一个在线应用工具

Json和Dict类型转换

在这里插入图片描述

处理JSON文件时,由于文件内容被视为单一字符串,不能直接使用其内部数据;
想要访问其键值对,需将其转换为Python字典,这样就可以程序中读取和修改;

  • Json数据是以字符串表示,Json转Dict叫反序列化;
  • Dict是内存中的实际数据结构对象,Dict转Json叫序列化;

Python的内置json模块是转换JSON与Python字典的便捷工具,提供高效方法处理JSON数据;
深入学习该模块可参考官方文档:https://docs.python.org/3/library/json.html。

在这里插入图片描述

json模块的使用

json模块是Python的内置模块,无需额外下载安装,使用时直接导入即可

import json

在这里插入图片描述

json模块中存在四种方法用来进行Python内置数据类型的转换:

方法说明
Json.dumps()将python对象编码成json字符串(dict转json)
json.loads()将json字符串解码成python对象(json转dict)
json.dump()将python中的对象转化成json存储到文件
json.load()将文件中的json格式转换成python对象提取出来

Python数据和Json数据的类型映射

dumps和dump函数的作用是将Python数据类型转成json类型数据;

转化对照表如下

Python数据类型Json数据类型
dictobject
list、tuplearray
str,unicodestring
int、floatnumber
Truetrue
Falsefalse
Nonenull

loads和load函数的作用是将json类型数据转换成Python数据类型;

转化对照表如下

Json数据类型Python数据类型
objectdict
arraylist
stringstr
numberint、float
trueTrue
falseFalse
nullNone

json.dumps

作用:将Python字典类型的数据转成json格式的数据

json.dumps(...)参数释义如下

import jsonjson.dumps(obj,    # 待转化的对象skipkeys=False,     # 默认值是False,若dict的keys内的数据不是python的基本类型(str,unicode,int,long,float,bool,None),设置为False时,就会报TypeError的错误。此时设置成True,则会跳过这类keyensure_ascii=True,  # 默认是ASCII码,若设置成False,则可以输出中文check_circular=True,# 若为False,跳过对容器类型的循环引用检查allow_nan=True,     # 若allow_nan为假,则ValueError将序列化超出范围的浮点值(nan、inf、-inf),严格遵守JSON规范,而不是使用JavaScript等价值(nan、Infinity、-Infinity)cls=None,indent=None,        # 参数根据格式缩进显示,表示缩进几个空格separators=None,    # 指定分隔符;包含不同dict项之间的分隔符和key与value之间的分隔符;同时去掉`: `encoding="utf-8",   # 编码default=None,       # 默认是一个函数,应该返回可序列化的obj版本或者引发类型错误;默认值是只引发类型错误sort_keys=False,    # 若为False,则字典的键不排序;设置成True,按照字典排序(a到z)**kw)

通过示例来解释上面几个常见参数的作用


1.字典数据中含有存在中文

import jsondict_data = {"name": "张三","age": 18,"sex": "男","address": "上海","phone": "10086"
}
# 字典转成json数据
json_data = json.dumps(dict_data)print(type(dict_data), dict_data)   # <class 'dict'> {'name': '张三', 'age': 18, 'sex': '男', 'address': '上海', 'phone': '10086'}
print(type(json_data), json_data)   # <class 'str'> {"name": "\u5f20\u4e09", "age": 18, "sex": "\u7537", "address": "\u4e0a\u6d77", "phone": "10086"}# 加上ensure_ascii=False参数即可将中文解码
json_data = json.dumps(dict_data, ensure_ascii=False)
print(type(json_data), json_data)   # <class 'str'> {"name": "张三", "age": 18, "sex": "男", "address": "上海", "phone": "10086"}

2.json数据通过缩进符美观输出
import jsondict_data = {"name": "张三","age": 18,"sex": "男","address": "上海","phone": "10086"
}
# 字典转成json数据
json_data = json.dumps(dict_data)
print(type(dict_data), dict_data)   # <class 'dict'> {'name': '张三', 'age': 18, 'sex': '男', 'address': '上海', 'phone': '10086'}
print(type(json_data), json_data)   # <class 'str'> {"name": "\u5f20\u4e09", "age": 18, "sex": "\u7537", "address": "\u4e0a\u6d77", "phone": "10086"}# 对json数据通过缩进符美观输出,使用indent参数
json_data = json.dumps(dict_data, ensure_ascii=False, indent=4)
print(type(json_data), json_data)
# <class 'str'> {
#     "name": "张三",
#     "age": 18,
#     "sex": "男",
#     "address": "上海",
#     "phone": "10086"
# }

3.对Python数据类型中键进行排序输出
import jsondict_data = {"name": "张三","age": 18,"sex": "男","address": "上海","phone": "10086"
}
# 字典转成json数据
json_data = json.dumps(dict_data)
print(type(dict_data), dict_data)   # <class 'dict'> {'name': '张三', 'age': 18, 'sex': '男', 'address': '上海', 'phone': '10086'}
print(type(json_data), json_data)   # <class 'str'> {"name": "\u5f20\u4e09", "age": 18, "sex": "\u7537", "address": "\u4e0a\u6d77", "phone": "10086"}# 对Python数据类型中键进行排序输出
json_data = json.dumps(dict_data, ensure_ascii=False, indent=4, sort_keys=True)
print(type(json_data), json_data)
# <class 'str'> {
#     "address": "上海",
#     "age": 18,
#     "name": "张三",
#     "phone": "10086",
#     "sex": "男"
# }

4.json数据分隔符的控制
import jsondict_data = {"name": "张三","age": 18,"sex": "男","address": "上海","phone": "10086"
}
# 字典转成json数据
json_data = json.dumps(dict_data)
print(type(dict_data), dict_data)   # <class 'dict'> {'name': '张三', 'age': 18, 'sex': '男', 'address': '上海', 'phone': '10086'}
print(type(json_data), json_data)   # <class 'str'> {"name": "\u5f20\u4e09", "age": 18, "sex": "\u7537", "address": "\u4e0a\u6d77", "phone": "10086"}# 对json数据通过缩进符美观输出,使用indent参数
json_data = json.dumps(dict_data, ensure_ascii=False)
print(type(json_data), json_data)   # <class 'str'> {"name": "张三", "age": 18, "sex": "男", "address": "上海", "phone": "10086"}json_data = json.dumps(dict_data, ensure_ascii=False, separators=(" + ", " @ "))
print(type(json_data), json_data)   # <class 'str'> {"name" @ "张三" + "age" @ 18 + "sex" @ "男" + "address" @ "上海" + "phone" @ "10086"}

json.dump

  • json.dump函数:将Json格式的数据写入文件中;
  • json.dumps函数:将Python字典类型的数据转成json格式的数据;
import jsondict_data = {"name": "张三","age": 18,"sex": "男","address": "上海","phone": "10086"
}# 使用json.dump;json数据一定是双引号
with open(file="test_json.json", mode="w", encoding="utf-8") as file:# 全部写入一行数据,不换行json.dump(dict_data,    # 待写入数据file,         # File对象sort_keys=True,       # 键的排序ensure_ascii=False)   # 显示中文# test_json.json文件内容如下:
# {"address": "上海", "age": 18, "name": "张三", "phone": "10086", "sex": "男"}with open(file="test_json.json", mode="w", encoding="utf-8") as file:# 全部写入一行数据,不换行json.dump(dict_data,    # 待写入数据file,         # File对象indent=4,     # 设置缩进sort_keys=True,       # 键的排序ensure_ascii=False)   # 显示中文# test_json.json文件内容如下:
# {
#     "address": "上海",
#     "age": 18,
#     "name": "张三",
#     "phone": "10086",
#     "sex": "男"
# }

json.loads

作用:将json格式的数据转换成python字典类型的数据;

import json# json字符串在python中是以字符串形式保存的,只是它的内部是按照json的规则构建
json_data = '{"address": "上海", "age": 18, "name": "张三", "phone": "10086", "sex": "男"}'
print(type(json_data), json_data)   # <class 'str'> {"address": "上海", "age": 18, "name": "张三", "phone": "10086", "sex": "男"}dict_data = json.loads(json_data)
print(type(dict_data), dict_data)   # <class 'dict'> {'address': '上海', 'age': 18, 'name': '张三', 'phone': '10086', 'sex': '男'}

json.load

作用:打开json文件,将之读取后转换成字典形式的数据;

  • json.load函数:打开json文件,将之转成字典形式的数据;
  • json.loads函数:将json格式的数据转换成python字典类型的数据;
import jsonwith open(file="test_json.json", mode="r", encoding="utf-8") as file:json_to_dict = json.load(file)  # json转成字典print(type(json_to_dict), json_to_dict) # <class 'dict'> {'address': '上海', 'age': 18, 'name': '张三', 'phone': '10086', 'sex': '男'}

Json和非Dict类型数据转换


1.元祖转换
import json# 定义一个元祖类型的数据
tuple_data = (1, 2, 3, 4, 5)# 将元祖类型的数据转换成json格式
json_data = json.dumps(tuple_data)print(type(json_data), json_data)   # <class 'str'> [1, 2, 3, 4, 5]

2.列表转换
import json# 定义一个列表类型的数据
list_data = [1, 2, 3, 4, 5]# 将列表类型的数据转换成json格式
json_data = json.dumps(list_data)print(type(json_data), json_data)   # <class 'str'> [1, 2, 3, 4, 5]

3.布尔值转换
import json# 定义一个布尔类型的数据
bool_data = True# 将布尔类型的数据转换成json格式
json_data = json.dumps(bool_data)print(type(json_data), json_data)   # <class 'str'> true

4.数值转换
import json# 定义一个数值类型的数据
bool_data = 10086# 将数值类型的数据转换成json格式
json_data = json.dumps(bool_data)print(type(json_data), json_data)   # <class 'str'> 10086

案例应用


1.JSON数据的合并与去重

假设有多个JSON文件,每个文件包含一组用户数据,并且希望将这些数据合并到一个文件中,同时去除重复的用户

import json# 定义一个函数来合并和去重JSON数据
def merge_and_deduplicate_json(file_list, output_file):users = []seen_users = set()for file_path in file_list:with open(file_path, 'r') as file:data = json.load(file)for user in data:user_id = user.get('id')if user_id not in seen_users:users.append(user)seen_users.add(user_id)# 将合并后的数据写入输出文件with open(output_file, 'w') as file:json.dump(users, file, indent=4)# 使用示例
merge_and_deduplicate_json(['users1.json', 'users2.json', 'users3.json'], 'merged_users.json')

2.JSON数据的动态查询与过滤

如果有一个大型的JSON数据集,并且需要根据特定的条件来查询和过滤数据,可以使用Python的json模块结合其他数据处理功能

import json# 读取JSON文件
with open('large_dataset.json', 'r') as file:data = json.load(file)# 定义一个函数来查询和过滤数据
def query_and_filter_data(data, query_conditions):filtered_data = []for item in data:if all(condition(item) for condition in query_conditions):filtered_data.append(item)return filtered_data# 定义查询条件
def is_age_over_25(item):return item['age'] > 25def has_email(item):return 'email' in item and item['email']# 查询和过滤数据
filtered_users = query_and_filter_data(data, [is_age_over_25, has_email])# 输出结果
for user in filtered_users:print(user)

总结

Python的json模块是一个非常方便的库,用于处理json格式的数据;
json数据是工作中经常会遇到的一种数据格式,也是很重要的一种数据;
本文首先对json数据及格式进行了简介,重新认识json数据;
其次,结合各种实际案例,将json和Python的各种数据类型,尤其是字典类型进行了转化;
最后,重要讲解了json数据的读取、写入和规范化的操作。

  • json序列化方法:
    dumps:无文件操作
    dump:序列化 + 写入文件
  • json反序列化方法:
    loads:无文件操作
    load:读文件 + 反序列化
  • 格式化写入文件使用indent参数 = 4
  • 将中文解码使用ensure_ascii参数 = False

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

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

相关文章

【软件测试】接口调不通排查分析+常遇面试题总结

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、接口调不通&am…

【论文阅读】深度学习在过冷沸腾气泡动力学分割中的应用

Application of deep learning for segmentation of bubble dynamics in subcooled boiling 深度学习在过冷沸腾气泡动力学分割中的应用 期刊信息&#xff1a;International Journal of Multiphase Flow 2023 级别&#xff1a;EI检索 SCI升级版工程技术2区 SCI基础版工程技术3区…

(libusb) usb口自动刷新

文章目录 libusb自动刷新程序Code目录结构Code项目文件usb包code包 效果描述重置reset热拔插使用 END libusb 在操作USB相关内容时&#xff0c;有一个比较著名的库就是libusb。 官方网址&#xff1a;libusb 下载&#xff1a; 下载源码官方编好的库github&#xff1a;Release…

新的一年,如何优化企业库存管理?

随着社会的发展和经济的不断增长&#xff0c;库存管理成为了企业运营中非常重要的一环。库存作为企业的资产之一&#xff0c;直接影响着企业的盈利能力和竞争优势。因此&#xff0c;对企业库存进行科学的分析和管理&#xff0c;成为了确保企业持续稳定发展的必要手段之一。企业…

比亚迪领航新能源时代:汉唐传承,品牌力量

比亚迪&#xff0c;以中国文化的深度与自信&#xff0c;为新能源汽车领域注入强大动力。汉唐车型&#xff0c;不仅承载着中国古代文明的辉煌&#xff0c;更以其创新技术和环保理念&#xff0c;终结油电之争&#xff0c;让燃油车再次破防。作为销量冠军&#xff0c;比亚迪品牌的…

android开发与实战,那些年Android面试官常问的知识点

前言 在做android项目开发时&#xff0c;大家都知道如果程序出错了&#xff0c;会弹出来一个强制退出的弹 出框&#xff0c;这个本身没什么问题&#xff0c;但是这个UI实在是太丑了&#xff0c;别说用户接受不了&#xff0c;就连 我们自己本身可能都接受不了。虽然我们在发布程…

1.2 debug的六种指令的使用,四个通用寄存器

汇编语言 首先进入环境 mount c d:masm //把c挂载在d盘中的masm当中 c: //进入c&#xff0c;进入到编译环境 dir //查看文件&#xff0c;可有可无Debug是DOS、Windows都提供的实模式&#xff08;8086 方式&#xff09;程序的调试工具。使用它可以查看CPU各种寄存器中的内容…

C语言基础18 循环

们可能需要多次执行同一块代码。一般情况下&#xff0c;语句是按顺序执行的&#xff1a;函数中的第一个语句先执行&#xff0c;接着是第二个语句&#xff0c;依此类推。 编程语言提供了更为复杂执行路径的多种控制结构。 循环语句允许我们多次执行一个语句或语句组&#xff0…

leetcode刷题(剑指offer) 46.全排列

46.全排列 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例 2&#xff1a; 输入&#…

OpenAI Triton 入门教程

文章目录 Triton 简介背景Triton 与 CUDA 的关系 Triton 开发样例样例一&#xff1a;Triton vector addition 算子Triton kernel 实现kernel 函数封装函数调用性能测试 样例二&#xff1a;融合 Softmax 算子动机Triton kernel 实现kernel 封装单元测试性能测试 样例三&#xff…

苍穹外卖Day03——解决总结3中存在的问题

解决Day03中存在的问题 1. ResponseBody 与 RequestBody2. RequestParam 与 PathVariable3. 字段填充技术&#xff08;注解、AOP、反射&#xff09;3.1. AOP3.2. 注解3.3. 反射3.5 字段填充在项目应用 4. 阿里云云存储OOS 1. ResponseBody 与 RequestBody ResponseBody&…

面试经典150题——矩阵置零

​"Dream it. Wish it. Do it." - Unknown 1. 题目描述 2. 题目分析与解析 2.1 思路一——暴力求解 思路一很简单&#xff0c;就是尝试遍历矩阵的所有元素&#xff0c;如果发现值等于0&#xff0c;就把当前行与当前列的值分别置为0。同时我们需要注意&#xff0c;…

【Java】基本数据类型、包装类与字符串间的转换 例题

写在前面&#xff1a; 关于这道题&#xff0c;初见感觉有点cpu烧坏了&#xff0c;准确来说是看了网上的一些讲解都感觉不尽人意。自己整理了一下&#xff0c;希望能帮助到大家。 题目&#xff1a; 如下两个题目输出结果相同吗&#xff1f;各是什么。 Object o1 true ? new…

java演唱会网上订票购票系统springboot+vue

随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的交换和信息流通显得特别重要。因此&#xff0c;开发合适的基于springboot的演唱会购票系统的设计与实现成为企业必然要走…

基于uniapp开发小程序,代码上线发布教程【抖音、微信】

本系列文章适合三类同学&#xff1a;1.希望学习小程序开发&#xff1b;2.希望无代码、低代码拥有自己的小程序&#xff1b;3.快速搭建小程序交作业、交毕设的大学生 本系列文章将推出配套桌面端软件&#xff0c;配合软件&#xff0c;可实现傻瓜式开发小程序&#xff0c;请有需求…

@Slf4j 变量log找不到符号,可能是 Gradle 配置文件写得有问题

Slf4j 变量log找不到符号 鄙人在学习 Java 的 spring boot 项目时, 常常因为 maven 配置文件使用 xml 格式过于复杂, 所以更倾向于使用 gradle 作为构建工具. 然而, 在使用 gradle 作为构建工具时, 又需要引用 Lombok 依赖. 有时忘记在初始化项目时添加上 Lombok 依赖, 所以经…

C++ deque详解以及容器适配器

目录 1.容器适配器 2.deque的使用 2.1deque的介绍 2.2deque的缺陷 2.3deque作为stack和queue的可行性 2.4 deque类的使用 2.4.1deque的构造函数 2.4.2deque容量操作 2.4.3deque赋值&#xff0c;插入 1.容器适配器 适配器是一种设计模式&#xff08;设计模式是一套被人…

idea创建一个简单的maven项目

个人学习笔记&#xff08;整理不易&#xff0c;有帮助点个赞&#xff09; 笔记目录&#xff1a;学习笔记目录_pytest和unittest、airtest_weixin_42717928的博客-CSDN博客 添加-DarchetypeCataloginternal 运行参数 (ps:不填的话&#xff0c;maven 骨架生成速度缓慢) 其实我没…

Redis---持久化

Redis是内存数据库&#xff0c;是把数据存储在内存中的&#xff0c;但是内存中的数据不是持久的&#xff0c;如果想要做到持久&#xff0c;那么就需要让redis将数据存储到硬盘上。 Redis持久化有两种策略&#xff1a; RDB > Redis DataBase RDB机制采取的是定期备份AOF …

c# ABB 机械手上位机连接

c# 程式开发和调试步骤如下&#xff1a; ABB 机械手要开启PC Interface功能。ABB 机械手设定ip地址。设定测试笔记本和机械手同一网段&#xff0c;用网线直连机械手&#xff0c;也可以通过交换机连接机械手。确保笔记本能够ping通和telnet 机械手80端口都是OK的。以上都OK的话…