55 votes

Xpath comme requête pour les dictionnaires python imbriqués

Existe-t-il un moyen de définir une requête de type XPath pour les dictionnaires python imbriqués.

Quelque chose comme ça:

 foo = {
  'spam':'eggs',
  'morefoo': {
               'bar':'soap',
               'morebar': {'bacon' : 'foobar'}
              }
   }

print( foo.select("/morefoo/morebar") )

>> {'bacon' : 'foobar'}

J'avais aussi besoin de sélectionner des listes imbriquées ;)

Cela peut être fait facilement avec la solution de @jellybean :

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

    return elem

foo = {
  'spam':'eggs',
  'morefoo': [{
               'bar':'soap',
               'morebar': {
                           'bacon' : {
                                       'bla':'balbla'
                                     }
                           }
              },
              'bla'
              ]
   }

print xpath_get(foo, "/morefoo/0/morebar/bacon")

[EDIT 2016] Cette question et la réponse acceptée sont anciennes. Les réponses les plus récentes peuvent mieux faire le travail que la réponse originale. Cependant, je ne les ai pas testés, je ne modifierai donc pas la réponse acceptée.

22voto

nikolay Points 601

L'une des meilleures bibliothèques que j'ai pu identifier, qui, en plus, est très activement développée, est un projet extrait de boto : JMESPath . Il a une syntaxe très puissante pour faire des choses qui prendraient normalement des pages de code à exprimer.

Voici quelques exemples:

 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]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X