繁体   English   中英

如何使用Python有选择地漂亮打印JSON项目?

[英]How to selectively pretty-print JSON item with Python?

我写了一个应用程序,可以帮助我搜索巨大的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))

...但是可悲的是,每个项目中的键太多,以至于在屏幕上占用了太多空间并使其不可读。 更糟糕的是,我不需要所有这些。 我想做的是有选择地从打印结果中删除某些key:value对,因此在我的示例中,假设仅对象key2将被打印。

我对手动打印(或制作列表)所需的key:value对不感兴趣。 这样做的人太多了,更不用说实际需求了。 相比之下,我只想删除少数的key:value对。 我更希望有一个要删除的键列表,这些键将在打印结果时使用,从而过滤实际打印的内容。

非常欢迎使用Pythonic一线客。

奖励问题:我主要是在寻找一种在每个项目中删除顶级key:value对的方法,但是为了全面了解我也很高兴地知道如何从子词典中删除key:value对是某些顶级键的值。

首先:使用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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM