簡體   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