比较python词典,找出两者的区别

时间:2014-01-23 00:32:41

标签: python json dictionary

所以我试着编写一个python程序,它将采用2个.json文件比较内容并显示两者之间的差异。到目前为止,我的程序需要用户输入来选择两个文件并比较两个文件就好了。我试图弄清楚如何打印两个文件之间的实际差异。

我的节目:

#!/usr/bin/env python2

import json

#get_json() requests user input to select a .json file
#and creates a python dict with the information
def get_json():
    file_name = raw_input("Enter name of JSON File: ")
    with open(file_name) as json_file:
        json_data = json.load(json_file)
        return json_data

#compare_json(x,y) takes 2 dicts, and compairs the contents
#print match if equal, or not a match if there is difrences
def compare_json(x,y):
    for x_values, y_values in zip(x.iteritems(), y.iteritems()):
        if x_values == y_values:
            print 'Match'
        else:
            print 'Not a match'

def main():
    json1 = get_json()
    json2 = get_json()
    compare_json(json1, json2)

if __name__ == "__main__":
    main()

我的.json示例:

{
    "menu": {
        "popup": {
            "menuitem": [
                {
                    "onclick": "CreateNewDoc()",
                    "value": "New"
                },
                {
                    "onclick": "OpenDoc()",
                    "value": "Open"
                },
                {
                    "onclick": "CloseDoc()",
                    "value": "Close"
                }
            ]
        },
        "id": "file",
        "value": "File"
    }
}

2 个答案:

答案 0 :(得分:3)

你的问题源于这样一个事实,即字典存储在具有内部逻辑一致性的结构中 - 当你要求someDict.items()someOtherDict.items()时,元素的键值对由它们计算算法。但是,由于两个字典中可能存在的键的差异,在dict.items()的调用返回的任一列表中的相应索引中可能不存在相同的键。因此,您最好检查另一个字典中是否存在特定键,并比较两者中的关联值。

def compare_json(x,y):
    for x_key in x:
        if x_key in y and x[x_key] == y[x_key]:
            print 'Match'
        else:
            print 'Not a match'
    if any(k not in x for k in y):
        print 'Not a match'

如果您想打印出实际差异:

def printDiffs(x,y):
    diff = False
    for x_key in x:
        if x_key not in y:
            diff = True
            print "key %s in x, but not in y" %x_key
        elif x[x_key] != y[x_key]:
            diff = True
            print "key %s in x and in y, but values differ (%s in x and %s in y)" %(x_key, x[x_key], y[x_key])
    if not diff:
        print "both files are identical"

答案 1 :(得分:0)

您可能想在python中试用jsondiff库。 https://pypi.python.org/pypi/jsondiff/0.1.0

该网站引用的示例如下。

>>> from jsondiff import diff

>>> diff({'a': 1}, {'a': 1, 'b': 2})
{<insert>: {'b': 2}}

>>> diff({'a': 1, 'b': 3}, {'a': 1, 'b': 2})
{<update>: {'b': 2}}

>>> diff({'a': 1, 'b': 3}, {'a': 1})
{<delete>: ['b']}

>>> diff(['a', 'b', 'c'], ['a', 'b', 'c', 'd'])
{<insert>: [(3, 'd')]}

>>> diff(['a', 'b', 'c'], ['a', 'c'])
{<delete>: [1]}

# Similar items get patched
>>> diff(['a', {'x': 3}, 'c'], ['a', {'x': 3, 'y': 4}, 'c'])
{<update>: [(1, {<insert>: {'y': 4}})]}

# Special handling of sets
>>> diff({'a', 'b', 'c'}, {'a', 'c', 'd'})
{<add>: set(['d']), <discard>: set(['b'])}

# Parse and dump JSON
>>> print diff('["a", "b", "c"]', '["a", "c", "d"]', parse=True, dump=True, indent=2)
{
  "$delete": [
    1
  ],
  "$insert": [
    [
      2,
      "d"
    ]
  ]
}