目录
问题背景
问题分析
问题解决
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数据可能会有各种各样的形式,可以利用这篇文章中涉及到的某部分功能代码进行适应性修改,有问题可以随时私信联系~