Как я могу найти определенное ключевое слово в файле Json, который имеет вложенные ключи и значения? - PullRequest
0 голосов
/ 14 марта 2020

Я несколько новичок в python и пытаюсь найти конкретное c ключевое слово в Json файле. Я читал о том, как работают словари и списки в python, и я сталкивался с этим:

complex_list = [["a",["b",["c","x"]]],42]
complex_list[0][1]
output: ['b', ['c', 'x']]
complex_list[0][1][1][0]
output: 'c'

Как я понимаю, в complex_ list[0][1], [0] - это полная скобка [, ] и [1] обращаются ко второй части скобки: [, [this one] ].

Теперь этот: complex_list = [["a",["b",["c","x"]]],42], в списке 2 элемента правильно? a, b, c и x принадлежат одному набору, а 42 принадлежит второму набору. Я не знаю, как это интерпретировать: complex_list[0][1][1][0] для доступа 'c'.

Может кто-нибудь сломать это, пожалуйста? Я спрашиваю об этом, потому что думаю, что это то, что мне нужно использовать для решения проблемы, которую я объясняю ниже.

Это небольшой пример файла, с которым я сейчас работаю:

{ (white)

  "results": [
    { (black)
      "Fruit": "Apple",
      "Nested fruit": [
        "Orange"
      ],
      "Title1": "Some text",
      "Contents": { (yellow)
        "Name 1": [
          "John Smith"
        ],
        "Name 2": [
          "Tyler"
        ],
        "Name 3": [
          "Bob",
          "Rob"
        ],
        "Name 4": [
          "Linda"
        ],
        "Name 5": [
          "Mark",
          "Matt"
        ],
        "Some boolean": [
          true
        ]
      }, (yellow)

      "More stuff": "More random text",
      "Confusing": [
        { (red)
          "Some info": "456",
          "Info I want": "849456"
        } (red)
      ],
      "Not important": [
        { (blue)
          "random text": "bla",
          "random text2": "bla bla"
        } (blue)
      ],
      "Not important 2": "000",
      "Not important3": [
        "whatever",
        "whatever"
      ],
      "Not important 4": "16",
      "Not important 5": "0058"
    } (black)
  ]
} (white)

Я поставил цвета в скобках рядом с соответствующими фигурными скобками, чтобы их было легко отличить guish. Следуя некоторым примерам в Интернете, я нашел:

import json

    with open('searchingKeywords.json') as f:
        data = json.load(f)
    print(data.keys())

    for k in data:
        for v in data[k]:
            if 'More stuff' in v:
                print("yes")

, который печатает:

dict_keys(['results'])
yes

Есть только 1 ключ, но как насчет содержимого? Разве это не другой ключ в результатах? Я так растерялся. Что меня интересует, так это «информация, которую я хочу» внутри «Запутанная». Как мне искать во многих вложенных вещах, если в нем содержится ключевое слово «Информация, которую я хочу»? Первоначально я пытался читать построчно - однажды я проанализировал файл Json в объекте Python - и затем увидел, найдено ли ключевое слово «Информация, которую я хочу» в каждой строке, но я продолжал получать ошибки. Кроме того, файл, с которым я работаю, огромен, и «Информация, которую я хочу» может быть вложена по-другому.

1 Ответ

1 голос
/ 15 марта 2020

Как уже упоминалось в комментариях, непринятый ответ в связанном вопросе отлично подходит для вашего случая:

data = {
  "results": [
    {
      "Fruit": "Apple",
      "Nested fruit": [
        "Orange"
      ],
      "Title1": "Some text",
      "Contents": {
        "Name 1": [ 
          "John Smith"
        ],
        "Name 2": [
          "Tyler"
        ],
        "Name 3": [
          "Bob",
          "Rob"
        ],
        "Name 4": [
          "Linda"
        ],
        "Name 5": [
          "Mark",
          "Matt"
        ],
        "Some boolean": [
          True
        ]
      },
      "More stuff": "More random text",
      "Confusing": [
        {
          "Some info": "456",
          "Info I want": "849456"
        }
      ],
      "Not important": [
        {
          "random text": "bla",
          "random text2": "bla bla"
        }
      ],
      "Not important 2": "000",
      "Not important3": [
        "whatever",
        "whatever"
      ],
      "Not important 4": "16",
      "Not important 5": "0058"
    }
  ]
}


def item_generator(json_input, lookup_key):
    if isinstance(json_input, dict):
        for k, v in json_input.items():
            if k == lookup_key:
                yield v
            else:
                yield from item_generator(v, lookup_key)
    elif isinstance(json_input, list):
        for item in json_input:
            yield from item_generator(item, lookup_key)


res = item_generator(data, 'More stuff')
print([x for x in res])

res = item_generator(data, 'Info I want')
print([x for x in res])

Вывод:

['More random text']
['849456']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...