Xpath like query for nested python dictionaries Xpath like query for nested python dictionaries python python

Xpath like query for nested python dictionaries


One of the best libraries I've been able to identify, which, in addition, is very actively developed, is an extracted project from boto: JMESPath. It has a very powerful syntax of doing things that would normally take pages of code to express.

Here are some examples:

search('foo | bar', {"foo": {"bar": "baz"}}) -> "baz"search('foo[*].bar | [0]', {    "foo": [{"bar": ["first1", "second1"]},            {"bar": ["first2", "second2"]}]}) -> ["first1", "second1"]search('foo | [0]', {"foo": [0, 1, 2]}) -> [0]


There is an easier way to do this now.

http://github.com/akesterson/dpath-python

$ easy_install dpath>>> dpath.util.search(YOUR_DICTIONARY, "morefoo/morebar")

... done. Or if you don't like getting your results back in a view (merged dictionary that retains the paths), yield them instead:

$ easy_install dpath>>> for (path, value) in dpath.util.search(YOUR_DICTIONARY, "morefoo/morebar", yielded=True)

... and done. 'value' will hold {'bacon': 'foobar'} in that case.


Not exactly beautiful, but you might use sth like

def xpath_get(mydict, path):    elem = mydict    try:        for x in path.strip("/").split("/"):            elem = elem.get(x)    except:        pass    return elem

This doesn't support xpath stuff like indices, of course ... not to mention the / key trap unutbu indicated.