CLI & Python API for comparing multiple dictionaries
Project description
dictsdiff provides a CLI and Python interface for comparing arbitrary number of nested dictionaries and show it as a tabular format via pandas.DataFrame.
CLI
Usage:
dictsdiff FILE [JSON_PATH] [FILE [JSON_PATH] ...] dictsdiff --ndjson=FILE.ndjson cat *.ndjson | dictsdiff [--ndjson=-]
When paths to multiple files are given, it loads the dictionaries from those files and compare (possibly) nested values in them. The key-value pairs that are different or missing are shown in a table format. A file path FILE may be followed by a JSONPath JSON_PATH which starts with $.. If FILE starts with $., prepend ./ to FILE to disambiguate the argument. JSON_PATH can be used for non-JSON files.
When no files are given, it is assumed that Newline delimited JSON (ndjson) is fed to the stdin.
Examples
$ 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 1 0 0.0
1.json 2 1 0.0
2.json 2 1 NaN
$ cat *.json | dictsdiff
a b.d b.e
0 1 0 0.0
1 2 1 0.0
2 2 1 NaN
If JSON files are pre-processed by jq, dictsdiff can handle its output when --compact-output/-c is passed:
jq --compact-output '' **/*.json | dictsdiff
To pass the original file path of JSON files to dictsdiff, use --info-key option combined with jq’s input_filename, e.g.,:
jq --compact-output '.path = input_filename' **/*.json \ | dictsdiff --info-key=path
Python interface
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
Installation
pip install dictsdiff # or pip install https://github.com/tkf/dictsdiff/archive/master.zip
Requirements
PyYAML (optional)
toml (optional)
jsonpath-rw (optional)
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
File details
Details for the file dictsdiff-0.1.1.tar.gz
.
File metadata
- Download URL: dictsdiff-0.1.1.tar.gz
- Upload date:
- Size: 12.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/1.11.0 pkginfo/1.4.2 requests/2.19.1 setuptools/39.2.0 requests-toolbelt/0.8.0 tqdm/4.24.0 CPython/3.7.0
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 8f810588de6bafdb2fc8b95dd40e45236a48c24fe8c868c8a3782a88d9056bea |
|
MD5 | 5353df2b1bde662cd5ec8d6657336cce |
|
BLAKE2b-256 | c2b174f09a68888f00a4da4a7507f67c1f8fe700f690b265dfd1e396cec6d8d7 |