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

目录

问题背景

问题分析

问题解决


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+"/"+file
        with 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"]=0
                    json_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):
                    pass
                else:
                    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数据可能会有各种各样的形式,可以利用这篇文章中涉及到的某部分功能代码进行适应性修改,有问题可以随时私信联系~

猜你喜欢

转载自blog.csdn.net/qq_35902025/article/details/130428789