用于比较多个词典的cli和python api
dictsdiff的Python项目详细描述
dictsdiff
提供了用于比较的cli和python接口
任意数量的嵌套字典并以表格形式显示
通过pandas.dataframe格式化。
cli
用法:
dictsdiff FILE [JSON_PATH] [FILE [JSON_PATH] ...] dictsdiff --ndjson=FILE.ndjson cat *.ndjson | dictsdiff [--ndjson=-]
当给出多个文件的路径时,它从 这些文件并比较(可能)其中的嵌套值。这个 不同或缺少的键值对显示在表中 格式。文件路径FILE后面可以跟一个JSONPathJSON_PATH,以$.开头如果FILE以 $.,将./前置到FILE,以消除参数的歧义。 JSON_PATH可用于非JSON文件
如果没有给出任何文件,则假定换行符分隔的json (ndjson)被馈送到stdin
示例
$ echo'{"a": 1, "b": {"c": 0, "d": 0, "e": 0}}' > 0.json $ echo'{"a": 2, "b": {"c": 0, "d": 1, "e": 0}}' > 1.json $ echo'{"a": 2, "b": {"c": 0, "d": 1}}' > 2.json $ dictsdiff *.json a b.d b.e path 0.json 100.0 1.json 210.0 2.json 21 NaN $ cat *.json | dictsdiff a b.d b.e 0100.0 1210.0 221 NaN
如果json文件由jq预处理,dictsdiff可以处理 传递--compact-output/-c时的输出:
jq --compact-output '' **/*.json | dictsdiff
要将json文件的原始文件路径传递给dictsdiff,请使用 --info-key选项与jq的input_filename组合,例如:
jq --compact-output '.path = input_filename' **/*.json \ | dictsdiff --info-key=path
python接口
dictsdiff.diff_dicts
>>> from dictsdiff import diff_dicts >>> dd = diff_dicts([ ... {'a': 1, 'b': {'c': 0, 'd': 0}}, ... {'a': 2, 'b': {'c': 0, 'd': 1}}, ... {'a': 1, 'b': {'c': 0, 'd': 1}}, ... ]) >>> dd.keys [('a',), ('b', 'd')] >>> dd.pretty_diff() a b.d 0 1 0 1 2 1 2 1 1
dictsdiff.diff_files
>>> from dictsdiff import diff_files >>> _ = open('0.json', 'w').write('{"a": 1, "b": 2}') >>> _ = open('1.json', 'w').write('{"a": 1, "b": 3}') >>> dd = diff_files(['0.json', '1.json']) >>> dd.keys [('b',)] >>> dd.pretty_diff() b path 0.json 2 1.json 3
dictsdiff.diff_ndjson
>>> import io >>> from dictsdiff import diff_ndjson >>> ndjson = u''' ... {"a": 1, "b": {"c": 0, "d": 0}} ... {"a": 2, "b": {"c": 0, "d": 1}} ... '''.strip() >>> dd = diff_ndjson(io.StringIO(ndjson)) >>> dd.keys [('a',), ('b', 'd')] >>> dd.pretty_diff() a b.d 0 1 0 1 2 1
安装
pip install dictsdiff # or pip install https://github.com/tkf/dictsdiff/archive/master.zip
要求
- pandas
- PyYAML(可选)
- toml(可选)
- jsonpath-rw(可选)