Как избирательно печатать элемент JSON с помощью Python? - PullRequest
0 голосов
/ 01 июля 2019

Я написал приложение, которое помогает мне искать гигантский файл JSON (дамп базы данных). JSON-файл загружается как список словарей, используя:

    with open ('myDB.json', 'r', encoding="utf-8") as file:
                    myDB = json.load(file)

Текущая структура myDB выглядит следующим образом:

    [
    {
    "object":"myobject",
    "key1":"value1",
    "key2":"value2",
    "key3":"value3",
    }
    {
    "object":"myobject",
    "key1":"value1",
    "key2":"value2",
    "key3":"value3",
    }
    ]

Некоторые значения являются списками, некоторые значения являются другими словарями, а некоторые являются просто обычными значениями.

В данный момент я выводю запрашиваемые элементы, печатая их довольно просто:

    for i in queryResults:
                print(json.dumps(i, indent = 3))

... но, к сожалению, в каждом элементе так много клавиш, что он занимает слишком много места на экране и делает его нечитаемым. Еще хуже, мне не нужно все это. Я хотел бы выборочно удалить определенные пары ключ: значение из результата печати, поэтому в моем примере, скажем, будут напечатаны только объект и ключ2 .

Меня не интересует ручная печать (или создание списков) нужных мне пар ключ-значение. Их слишком много, чтобы сделать это таким образом, не говоря уже о том, что реальные потребности могут измениться. Для сравнения есть только пара ключей : значение пар, которые я хочу удалить. Я предпочел бы иметь список ключей для удаления, которые будут использоваться при печати результатов, таким образом, фильтруя то, что на самом деле напечатано.

Приветствуются Pythonic one-liners.

БОНУСНЫЙ ВОПРОС: В первую очередь я ищу способ удалить пары ключ: значение верхнего уровня в каждом предмете, но ради полного знания я буду счастлив также знать, как удалить пары key: value из под-словарей, которые являются значениями определенных ключей верхнего уровня.

1 Ответ

2 голосов
/ 01 июля 2019

Первое: используйте библиотеку pprint, она сделана для этого.

В противном случае, простым решением было бы отфильтровать диктовку, а затем распечатать ее. Примерно так будет работать для удаления ключа верхнего уровня

filtered_results = [{k:v for k, v in elem.items() if k not in keys_to_remove} for elem in query_results]

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

def filter_results(results, keys_to_remove):
    if isinstance(results, list):
        return [filter_results(item) for item in list]
    elif isinstance(results, dict):
        return {k:filter_results(v) for k,v in results.items() if k not in keys_to_remove}
    else:
        return results
...
filtered_results = filter_results(query_results)

После чего вы можете просто распечатать его на досуге

import pprint
...
pprint.pprint(filtered_results)
...