Python实现json数据清洗、json数据去重、json数据统计

news/2025/2/1 12:48:15/

目录

问题背景

问题分析

问题解决


1.问题背景

1.文件夹中有若干json文件,每个文件中json格式基本一致;(一般是按时间排序的文件名)

2.部分json数据缺失,需要补充这部分缺失是json数据;

3.针对json种某个属性(键)对应的值,进行去重处理;

4.统计某个属性(键)对应值出现的次数;

2.问题分析

1.循环读取文件夹中所有文件,以及循环读取每个文件中所有的json数据;

2.获取每个json所有的keys,如果缺失某个key,那就在该条json新建一个键值对;

3.以某个属性(键)为基准,通常为主键id,进行去重处理,也是一种数据清洗的过程;

4.统计出某个键值对出现的次数,输出打印出来。

3.问题解决

我们的目标是:统计所有文件json数据中不重复id对应type值的个数,缺失type属性的json补充上type,令其值等于0。

代码如下,大概思路是:

1.os.listdir()函数可以提取出文件夹中所有的文件名,然后拼接成完整路径,循环打开每一份文件file,file1-file3的具体内容可以看最后面的示例;

2.因为示例中的json是嵌套的,id,type等子数据都在“objecrt”这个父级数据下面,通过json.load()函数,将json格式转换为字典格式,然后对于缺失type的json数据进行筛选补充;

3.去重用到了any()函数,any()函数是python内置函数之一。 它以iterable作为参数,如果iterable中的任何元素为True,则返回True。 如果iterable为空,则返回False。而any()函数中的内容是python for语句后置的一种写法,作用是实现列表生成器generator;这样的语法会创建一个创建一个列表生成器generator,而generator是一个可迭代的iterable对象,便利了for循环中所有符合前面条件的值,最终如果id重复了,那就pass,如果不重复,就放到一个新列表中。

4.而最后的统计中使用了sorted,groupby和lamda表达式,sorted和lamda实现了按照某个键来进行排序,而groupby实现了分组统计,将键和值关联起来,最后打印结果输出。

import json
import os
from itertools import groupby#rootdir根文件夹路径
#listdir文件夹名
def get_json(rootdir,listdir):#提取json数据json_data=[]files = os.listdir(listdir)for file in files:path=rootdir+"/"+filewith open(path,'r') as f:for line in f.readlines():json_context = json.loads(line)json_context=json_context["objects"]for x in json_context:if "type" not in list(x.keys()):x["type"]=0json_data.append(x)#print(json_data)json_data_new[]#去重for x in json_data:if any(str(d.get("id",None)).lower()==str(x["id"]).lower() for d in json_data_new):passelse:json_data_new.append()#print(json_data_new)#统计输出type_sort = sorted(json_data_new, key=lambda x: x["type"])type_group = groupby(type_sort, key=lambda x: x["type"])for key, group in type_group:print("type:",key,"count:",len(list(group)))f.close()if __name__ == '__main__':get_json("D:/Data/testdata","./testdata")

结果:

type:0 count:1
type:1 count:8
type:2 count:2
type:3 count:1
type:4 count:2

文件夹示例:

file1{"object":[{"id":10945595,"type":1},{"id":10945596,"type":2},{"id":10945595,"type":1},{"id":10945598,"type":4},[{"id":10945599,"type":1},{"id":1000000}]}file2{"object":[{"id":20945595,"type":1},{"id":20945596,"type":2},{"id":0945597,"type":3},{"id":20945598,"type":4},[{"id":20945599,"type":1}]}file3{"object":[{"id":30945595,"type":2},{"id":30945596,"type":1},{"id":3095597,"type":1},{"id":30945598,"type":1},[{"id":30945599,"type":5}]}

4.总结

这个关于json数据提取,处理和统计的小脚本包含的细节还是很多的,当然这里的json文件为了测试修改成简单的表述,实际json数据可能会有各种各样的形式,可以利用这篇文章中涉及到的某部分功能代码进行适应性修改,有问题可以随时私信联系~


http://www.ppmy.cn/news/56597.html

相关文章

【算法】欧拉路径的DFS存储顺序

欧拉路径和欧拉回路 对于无向图,所有边都是连通的。 (1)存在欧拉路径的充分必要条件:度数为奇数的点只能有0个或2个。 (2)存在欧拉回路的充分必要条件:度数为奇数的点只能有0个。 对于有向图&a…

MySQL-----复合查询

文章目录 前言一、基本查询回顾二、 多表查询解决多表查询的思路 三、自连接四、子查询1. 单行子查询2. 多行子查询3. 多列子查询4. 在from子句中使用子查询5. 合并查询5.1 union5.2 unoin all 总结 前言 前面的学习中,对于mysql表的查询都是对一张表进行查询,在实际开发中这远…

(有假币,因子个数)笔试强训

博主简介:想进大厂的打工人博主主页:xyk:所属专栏: JavaEE初阶 目录 文章目录 一、选择1 二、选择2 二、[编程题]有假币 三、[编程题]因子个数 一、选择1 在使用锁保证线程安全时,可能会出现活跃度失败的情况,活跃度失败主要…

从根本上理解Synchronized的加锁过程

作为一个Java开发,对于Synchronized这个关键字并不会陌生,无论是并发编程,还是与面试官对线,Synchronized可以说是必不可少。 在JDK1.6之前,都认为Synchronized是一个非常笨重的锁,就是在之前的《谈谈Java…

linux下的权限管理

1.shell概念 当我们在进入正文前先给大家普及一些基础概念。 广义上来讲,linux 发行版 linux内核 外壳程序(这个外壳程序就相当于 windows gui(窗口图形),linux 常用的shell 是 bash) 所以&#xff0c…

雪花算法使用以及优化问题 附代码

/*** 雪花算法生成分布式唯一ID*/ public class Snowflake {private long datacenterId; // 数据中心IDprivate long machineId; // 机器标识IDprivate long sequence; // 序列号private long lastStamp; // 上一次时间戳// 雪花算法参数private final static long datacenter…

《语文教学通讯》栏目 收稿范围

《语文教学通讯》创刊于1978年,是由山西师范大学主管,山西师大教育科技传媒集团主办的期刊。历年被人民大学书报资料中心转载、复印的篇幅数量均居同类报刊之首。国内刊号:CN 14-1017/G4,国际刊号:ISSN 1004-6097&…

Java中的集合框架有哪些类?

Java中的集合框架是一个用于存储和操作对象的集合类库,提供了一系列的接口和类,用于支持不同的集合类型。在Java中,集合框架主要由接口、实现类、算法和数组工具类等四个部分组成。 接口 Java中的集合框架提供了一系列接口,其中…