使用 Python 读取 json 格式文件并查重

当JSON文件中存在多行测试数据,需判断“esbsn”字段值是否重复。数据多肉眼观察难保证结果,因此引入Python脚本。设计思路为逐行读取文件解析为字典,取出判重字段值添加到列表,用Count函数跟踪出现次数,最后给出完整代码。

场景如下:

格式为 json 的文件中存在多行测试数据,需要判断文件中 “esbsn” 字段的值是否存在重复数据

{"time":"2022-08-09 10:00:31:947","esbsn":"000000175059","status":"S"}
{"time":"2022-08-09 10:01:46:466","esbsn":"000000175060","status":"S"}
{"time":"2022-08-09 09:59:07:089","esbsn":"000000175058","status":"S"}
{"time":"2022-08-09 10:03:31:887","esbsn":"000000175061","status":"S"}
{"time":"2022-08-09 10:01:46:466","esbsn":"000000175060","status":"S"}
{"time":"2022-08-09 09:15:57:134","esbsn":"000000175037","status":"S"}
{"time":"2022-08-09 09:13:54:331","esbsn":"000000175036","status":"S"}
{"time":"2022-08-09 10:01:46:466","esbsn":"000000175060","status":"S"}

数据较少时可以通过肉眼观察较快得出结论,假如数据较多时,想通过肉眼观察得出结论将花费大量的时间且结果的正确性也难以保证,由此引入 python 脚本的方法去对 json 文件进行解析并针对特定字段进行字段值查重。

设计思路:
1、先逐行读取json文件,将每行读取的字符串解析为python字典

with open(file_path, 'r', encoding="utf-8") as f:
    #   逐行读取文件内容
    for line in f.readlines():
        #  将每行读取的内容解析为字典
        json_data = json.loads(line)
        print(json_data)

结果显示:

{"time":"2022-08-09 10:00:31:947","esbsn":"000000175059","status":"S"}
{"time":"2022-08-09 10:01:46:466","esbsn":"000000175060","status":"S"}
{"time":"2022-08-09 09:59:07:089","esbsn":"000000175058","status":"S"}
{"time":"2022-08-09 10:03:31:887","esbsn":"000000175061","status":"S"}
{"time":"2022-08-09 10:01:46:466","esbsn":"000000175060","status":"S"}
{"time":"2022-08-09 09:15:57:134","esbsn":"000000175037","status":"S"}
{"time":"2022-08-09 09:13:54:331","esbsn":"000000175036","status":"S"}
{"time":"2022-08-09 10:01:46:466","esbsn":"000000175060","status":"S"}

这样我们就可以得到json文件内数据内容了,方便后续我们对这些数据内容进行处理。

2、取出字典中要判重字段的值,并将值添加到列表中方便后面判重

dict1={'time': '2022-08-09 10:00:31:947', 'esbsn': '000000175059',, 'status': 'S'}
dict2={'time': '2022-08-09 10:01:46:466', 'esbsn': '000000175060', 'status': 'S'}
dict3={'time': '2022-08-09 09:59:07:089', 'esbsn': '000000175059', 'status': 'S'}
#  先构建一个空列表
a = []
#  再将每个字典中trace_id的值取出放在列表内
a.append(dict1["trace_id"])
a.append(dict2["trace_id"])
a.append(dict3["trace_id"])
print(a)

结果显示:

['000000175059', '000000175060', '000000175059']

把要判重的数据值添加到字典内,方便后续对字典内的元素进行判重。

3、得到判重字段值的列表数据后,可以使用Count函数跟踪字段值出现的次数

a = ['000000175059', '000000175060', '000000175059']
#  跟踪列表 a 中字段值出现的次数,并转化为字典形式,如{字段值:次数}
b = dict(Counter(a))
print(b)
#  只展示重复元素(出现次数大于1的元素)
print([key for key, value in b.items() if value > 1])
#  展现重复元素和重复次数
print({key: value for key, value in b.items() if value > 1})

结果显示:

{'000000175059': 2, '000000175060': 1}
['000000175059']
{'000000175059': 2}

这样就可以看出字典内每个元素出现的次数了,元素次数大于1的就是重复数据拉。

4、完整代码如下:

import json
import os
from collections import Counter  # 引入Counter

#  获取要解析Json文件的绝对路径
file_path = os.path.abspath("../conf/test.json")

class read_Json():

    def __init__(self , param):
        #  设置需要判重的字段
        self.param = param

    def read_json(self):

        #  开始json文件
        with open(file_path, 'r' ,encoding="utf-8") as f:

            #  先构建一个空的列表,方便后续导入要判重的字段
            a = []

            #  逐行读取文件内容
            for line in f.readlines():

                #  将每行读取的内容解析为字典
                json_data = json.loads(line)
                #  取出字典数据中需要判重的数据值
                x = json_data[self.param]
                #  将需要判重的值添加值原来构建的列表 a 中
                a.append(x)

            #  跟踪列表 a 中字段值出现的次数,并转化为字典形式,如{字段值:次数}
            b = dict(Counter(a))
            #  只展示重复元素(出现次数大于1的元素)
            print([key for key, value in b.items() if value > 1])
            #  展现重复元素和重复次数
            print({key: value for key, value in b.items() if value > 1})

#  测试验证
if __name__ == "__main__":
    print(read_Json("esbsn").read_json())
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值