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

news2025/2/27 23:13:01

文章目录

      • 文章开篇
      • 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 json

json.dumps(
    obj,    # 待转化的对象
    skipkeys=False,     # 默认值是False,若dict的keys内的数据不是python的基本类型(str,unicode,int,long,float,bool,None),设置为False时,就会报TypeError的错误。此时设置成True,则会跳过这类key
    ensure_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 json

dict_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 json

dict_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 json

dict_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 json

dict_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 json

dict_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 json

with 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'] > 25

def 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.coloradmin.cn/o/1477158.html

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

相关文章

Rocky Linux 运维工具 tar

一、tar的简介 tar​命令是Linux操作系统中用于打包和解压文件的工具。通过 ​tar​可以将多个文件或目录打包成一个归档文件&#xff0c;也可以解压这些归档文件。 二、tar的参数说明 -c 用于将指定的文件或目录打包成一个归档文件&#xff0c;即压缩归档文件 -f 用于指定归档…

Kubernetes activemq系列| k8s 部署activemq artemis

一、ActiveMQ Artemis介绍 Apache ActiveMQ Artemis 是一个高性能的开源消息代理,它完全符合 Java Message Service (JMS) 2.0 规范,并支持多种通信协议,包括 AMQP、MQTT、STOMP 和 OpenWire 等。ActiveMQ Artemis 由 Apache Software Foundation 开发和维护,旨在提供可靠…

select * from 表 c=‘1‘ and b=‘2‘ and a=‘3‘; abc是联合索引,这样查询会命中索引吗?

倒叙也会命中索引 但是要注意&#xff0c;倒叙的时候必须要有a存在&#xff0c;否则就会索引失效 因为mysql底层会有优化器去进行优化&#xff0c;但是如果没有a的话&#xff0c;那么优化器就不知道要优化那个索引了&#xff0c;所以他走了全表&#xff0c;导致索引失效

小程序实现定位城市切换且城市根据首字母A-Z排序后端数据实现逻辑

场景&#xff1a; 话不多说后端提供数据实现步骤&#xff1a; 1.controller层 Api(tags {"[地区]-城市相关接口"}) RestController RequestMapping("region") Slf4j public class RegionController extends BaseController {Resourceprivate RegionServ…

车载电子电器架构 —— 基础技术开发概述

车载电子电器架构 —— 基础技术开发概述 我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 屏蔽力是信息过载时代一个人的特殊竞争力&#xff0c;任何消耗…

【数据结构】单链表解析+完整代码(插入、删除、尾插法、头插法、按值和按位查找、前插和后插)带头结点和不带两种实现

文章目录 3.1 单链表3.1.1 单链表的定义3.1.2 单链表的插入A.按位序插入&#xff08;带头结点&#xff09;B.按位序插入&#xff08;不带头结点&#xff09;C.指定结点的后插操作D.指定结点的前插操作 3.1.3 单链表的删除A.按位序删除B.删除指定结点 3.1.4 单链表的查找A.按位查…

jetson nano——编译安装opencv-python==4.3.0.38

目录 1.下载源码&#xff0c;我提供的链接如下&#xff1a;2.解压文件3.安装依赖scikit4.安装opencv-python5.查看opencv-python版本 系统&#xff1a;jetson-nano-jp451-sd-card-image ubuntu 18.04 1.下载源码&#xff0c;我提供的链接如下&#xff1a; 链接&#xff1a;http…

使用 OpenCV 通过 SIFT 算法进行对象跟踪

本文介绍如何使用 SIFT 算法跟踪对象 在当今世界&#xff0c;当涉及到对象检测和跟踪时&#xff0c;深度学习模型是最常用的&#xff0c;但有时传统的计算机视觉技术也可能有效。在本文中&#xff0c;我将尝试使用 SIFT 算法创建一个对象跟踪器。 为什么人们会选择使用传统的计…

如何对比 MySQL 主备数据的一致性?

随着业务范围的扩大&#xff0c;很多企业为了保障核心业务的高可用性&#xff0c;选择了 MySQL 主从架构&#xff0c;这一套方案通常具备主备数据同步、数据备份与恢复、读写分离、高可用切换等特性&#xff0c;是一种相当成熟可靠的数据库架构方案。然而这套方案在特定情况下可…

数电学习笔记——逻辑代数的基本定理

目录 一、带入定理 二、反演定理 三、对偶定理 一、带入定理 在任何一个包含变量A的逻辑等式中&#xff0c;若以另外一个逻辑式代入式中所有A的位置&#xff0c;则等式仍然成立。 例1&#xff1a;&#xff08;AB&#xff09;AB 将&#xff08;BC&#xff09;带入等式中所…

阿里云2024年服务器2核4G配置评测_CPU内存带宽_优惠价格

阿里云2核4G服务器多少钱一年&#xff1f;2核4G服务器1个月费用多少&#xff1f;2核4G服务器30元3个月、85元一年&#xff0c;轻量应用服务器2核4G4M带宽165元一年&#xff0c;企业用户2核4G5M带宽199元一年。本文阿里云服务器网整理的2核4G参加活动的主机是ECS经济型e实例和u1…

Python实现时间序列分析进行平稳性检验(ADF和KPSS)和差分去趋势(adfuller和kpss算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 时间序列分析中的平稳性检验是评估一个时间序列是否具有稳定的均值和方差。在经济学、金融学以及其他诸…

计算机专业电影推荐

1、《盗梦空间》 上映时间&#xff1a;2010-09-01 故事讲述了一群专业盗梦人的冒险旅程&#xff0c;他们试图在梦境中窃取最珍贵的秘密。但是&#xff0c;在这个精心设计的梦境中&#xff0c;他们面临着越来越多的挑战和危险。 这部电影不仅有令人难以置信的故事情节&#xf…

nvm安装和使用保姆级教程(详细)

一、 nvm是什么 &#xff1a; nvm全英文也叫node.js version management&#xff0c;是一个nodejs的版本管理工具。nvm和npm都是node.js版本管理工具&#xff0c;为了解决node.js各种版本存在不兼容现象可以通过它可以安装和切换不同版本的node.js。 二、卸载之前安装的node: …

Linux的gdb调试

文章目录 一、编译有调试信息的目标文件二、启动gdb调试文件1、查看内容list/l&#xff1a;l 文件名:行号/函数名&#xff0c;l 行号/函数名2、打断点b&#xff1a;b文件名:行号/函数名&#xff0c;b 行号/函数名 与 查看断点info/i&#xff1a;info b3、删除断点d&#xff1a;…

字节面试问题

实现三列布局的方法 第一种&#xff1a;可以使用浮动margin 第二种&#xff1a;浮动BFC <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, in…

每日OJ题_牛客DD1 连续最大和(IO型OJ)

目录 牛客DD1 连续最大和 解析代码 牛客DD1 连续最大和 连续最大和_牛客题霸_牛客网 解析代码 #include <climits> #include <iostream> #include <vector> using namespace std; int main() {int n 0;cin >> n;vector<int> arr(n);for (in…

通过大语言模型理解运维故障:评估和总结

张圣林 南开大学软件学院副教授、博士生导师 第六届CCF国际AIOps挑战赛程序委员会主席 在ATC、WWW、VLDB、KDD、SIGMETRICS等国际会议和JSAC、TC、TSC等国际期刊发表高水平论文50余篇。主持国家自然科学基金项目2项&#xff0c;横向项目13项&#xff08;与华为、字节跳动、腾讯…

【C++11】C++11新特性(上)

1、C11简介 在2003年C标准委员会曾经提交了一份技术勘误表(简称TC1)&#xff0c;使得C03这个名字已经取代了C98称为C11之前的最新C标准名称。不过由于C03(TC1)主要是对C98标准中的漏洞进行修复&#xff0c;语言的核心部分则没有改动&#xff0c;因此人们习惯性的把两个标准合并…

基于MQTT协议实现微服务架构事件总线

一、场景描述 昨天在博客《客户端订阅服务端事件的实现方法》中提出了利用websocket、服务端EventEmitter和客户端mitt实现客户端订阅服务端事件&#xff0c;大大简化了客户端对服务端数据实时响应的逻辑。上述方案适用于单服务节点的情形。 对于由服务集群支撑的微服务架构&…