找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 7501|回复: 5

[已回复] python 比较两个大json文件

1

主题

1

帖子

1

积分

贫民

积分
1
bote419 发表于 2017-2-9 10:20:16 | 显示全部楼层 |阅读模式
各位大大:
    问个问题,最近正在研究怎么用python比较两个json文件,然后输出不同的部分,大家能不能给点意见。

    这两个json文件有1M多,而且里面内容嵌套比较多,也可能有相同的关键字,举个例子:

{
"axcresblock" : {
                                        "1" : {
                                                "localCellRef" : "/mz/p/v1/pbts/1/localCell/1",
                                                "moAddress" : {
                                                        "distName" : "R1.Ant1.W.Tx1",
                                                        "uri" : "/mz/p/v1/pbts/1/axcresblock/1"
                                                },
                                                "rp3NodeAddress" : 513,
                                                "antennaRef" : "/mz/p/v1/pbts/1/frm/1/radio/1/antenna/a"
                                        },
                                        "2" : {
                                                "localCellRef" : "/mz/p/v1/pbts/1/localCell/1",
                                                "moAddress" : {
                                                        "distName" : "R1.Ant1.W.Rx1",
                                                        "uri" : "/mz/p/v1/pbts/1/axcresblock/2"
                                                },
                                                "rp3NodeAddress" : 512,
                                                "antennaRef" : "/mz/p/v1/pbts/1/frm/1/radio/1/antenna/a"
                                        },

}

我考虑过把两个json文件读进来转成字典再进行比较,但是处理起来也比较麻烦,大家有什么比较好的建议,谢谢!
补充一句: 这些json文件的内容不是向我上面那样写的很规则,文件的内容都是在一行显示的,比如:{
"axcresblock" : {"1" : { "localCellRef" : "/mz/p/v1/pbts/1/localCell/1","moAddress" : {"distName" : "R1.Ant1.W.Tx1","uri" : "/mz/p/v1/pbts/1/axcresblock/1"}, "rp3NodeAddress" : 513,"antennaRef" : "/mz/p/v1/pbts/1/frm/1/radio/1/antenna/a" },}
回复

使用道具 举报

50

主题

1057

帖子

1108

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1108

活跃会员热心会员最佳导师默默耕耘突出贡献优秀版主荣誉管理论坛元老

blueelwang 发表于 2017-2-9 20:34:06 | 显示全部楼层
直接使用json模块解析数据, 然后循环比较数据项即可,感觉并不需要转换为字典
回复 支持 反对

使用道具 举报

0

主题

1

帖子

1

积分

贫民

积分
1
liudoutang 发表于 2017-7-22 11:14:45 | 显示全部楼层
我现在遇到一个性能优化的问题,需要比较两个大的json文件的差异,这两个json文件中对象以列表的形式存在并且对象结构一致,需要找出不同的对象,并输出。

json文件可能会达到100M
回复 支持 反对

使用道具 举报

1

主题

28

帖子

28

积分

贫民

积分
28
cdbclx 发表于 2017-7-22 14:27:29 | 显示全部楼层
本帖最后由 cdbclx 于 2017-7-22 14:30 编辑

没想到什么好的思路,主要是json数据是键值类数据,是类字典的,存放的时候是无序的。另外用你提供的数据做json数据,loads的时候报错,就没用,就简单的写了两个字典,思路就是用先遍历其中一个字典,如果字典的键在另外一个字典存在,如果字典的值为字典的时候,就递归调用比较函数,否则直接比较值,相等则一样,不等则打印。 如果字典的键在另外一个字典中不存在,则直接打印该字典中存在该键,另外一个不存在。
然后再反向的来一遍,区别就是只打印本字典存在键,另外一个字典不存在的该键的,因为键存在的,已经在上面比较过了

#!/usr/bin/env python2.7
#_*_coding:utf-8_*_
import json

def comp1(a,b,m,n,f=0):
  for i in a:
    if i  in b:
      if a==b:
        pass
      else:
        if isinstance(a,dict) and isinstance(b,dict):
          m=m+"的键%s"%i
          n=n+"的键%s"%i
          comp1(a,b,m,n,f)
        else:
          if f==0:
            print "%s中的键%s的值为%s"%(m,i,a)
            print "%s中的键%s的值为%s"%(n,i,b)
    else:
      print "%s中有%s"%(m,str(i))           

aa={"1":"2","3":"5","5":{'3':'6'}}
bb={"1":"3","5":{'3':'7'}}
comp1(aa,bb,"aa","bb",f=0)
comp1(bb,aa,"bb","aa",f=1)

执行结果如下:
aa中的键1的值为2
bb中的键1的值为3
aa中有3
aa的键5中的键3的值为6
bb的键5中的键3的值为7

想不出什么好思路,希望大侠能给一个好的思路,学习学习
回复 支持 反对

使用道具 举报

1

主题

25

帖子

25

积分

贫民

积分
25
陈继塬 发表于 2017-7-22 18:53:22 | 显示全部楼层
cdbclx 发表于 2017-7-22 14:27
没想到什么好的思路,主要是json数据是键值类数据,是类字典的,存放的时候是无序的。另外用你提供的数据做 ...

set你去了解下集和里的交集
回复 支持 反对

使用道具 举报

1

主题

28

帖子

28

积分

贫民

积分
28
cdbclx 发表于 2017-7-22 23:59:41 | 显示全部楼层
是个思路,关键是怎么把 dict 转化为set ??
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表