如何使用 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))
...但遗憾的是,每个项目中的键太多,以至于在屏幕上占据了太多 space 并使其无法读取。更糟糕的是,我不需要所有这些。我想做的是有选择地从打印结果中删除某些 key:value 对,所以在我的示例中,我们只说 object 和key2 将被打印出来。
我对手动打印(或列出)我需要的 key:value 对不感兴趣。有太多的人不能这样做,更不用说实际需求可能会改变。相比之下,我只想删除少数 key:value 对。我更喜欢的是有一个要删除的键列表,打印结果时将使用这些键,从而过滤实际打印的内容。
非常欢迎使用 Pythonic 的一行代码。
奖金问题: 我主要在寻找一种方法来删除每个项目中的顶级 key:value 对但是为了获得完整的知识,我也很乐意知道如何从作为某些顶级键值的子词典中删除 key:value 对。
首先:使用 pprint
库,它是为此而制作的。
否则,直接的解决方案是过滤字典,然后漂亮地打印它。这样的事情适用于 top-level 密钥删除
filtered_results = [{k:v for k, v in elem.items() if k not in keys_to_remove} for elem in query_results]
虽然要获得 lower-level 你可能需要做一些递归的事情,比如
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)
我编写了一个应用程序来帮助我搜索巨大的 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))
...但遗憾的是,每个项目中的键太多,以至于在屏幕上占据了太多 space 并使其无法读取。更糟糕的是,我不需要所有这些。我想做的是有选择地从打印结果中删除某些 key:value 对,所以在我的示例中,我们只说 object 和key2 将被打印出来。
我对手动打印(或列出)我需要的 key:value 对不感兴趣。有太多的人不能这样做,更不用说实际需求可能会改变。相比之下,我只想删除少数 key:value 对。我更喜欢的是有一个要删除的键列表,打印结果时将使用这些键,从而过滤实际打印的内容。
非常欢迎使用 Pythonic 的一行代码。
奖金问题: 我主要在寻找一种方法来删除每个项目中的顶级 key:value 对但是为了获得完整的知识,我也很乐意知道如何从作为某些顶级键值的子词典中删除 key:value 对。
首先:使用 pprint
库,它是为此而制作的。
否则,直接的解决方案是过滤字典,然后漂亮地打印它。这样的事情适用于 top-level 密钥删除
filtered_results = [{k:v for k, v in elem.items() if k not in keys_to_remove} for elem in query_results]
虽然要获得 lower-level 你可能需要做一些递归的事情,比如
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)