簡體   English   中英

如何在iPython中打印字典

[英]How to pretty print dictionaries in iPython

我目前正在使用RethinkDB,它有一個很好的Web UI和一個Data Explorer,允許用戶打印出數據庫的內容,如下所示:

在此輸入圖像描述

請注意,每個鍵值對都從一個新行開始,鍵和值(大多數)具有不同的顏色。 相比之下,如果我使用iPython打印出相同的內容,我會得到一個幾乎難以辨認的結果:

在此輸入圖像描述

如果我迭代光標並print每個項目,這會略微改善,如下所示:

在此輸入圖像描述

但是,這需要更多的打字,但仍然不如RethinkDB Web UI。 是否可以安裝一個iPython插件來改善打印輸出的外觀?

(我看了一下pprint ,但這似乎只能控制文本的位置,而不是它的顏色)。

你可以使用json.dumps()

import json 

for row in r.db(....).run(conn):
    print(json.dumps(row, indent=4))

雖然這不按排序順序顯示鍵,但在示例中似乎是這樣,但它可能足以滿足您的需要。 正如@coder所指出的那樣, json.dumps()可以通過指定sort_keys=True參數對鍵進行排序。

for row in r.db(....).run(conn):
    print(json.dumps(row, indent=4, sort_keys=True))

也可以直接打印對象(尚未測試過):

print(json.dumps(r.db(....).run(conn), indent=4, sort_keys=True)

這也可能會打印出周圍的“列表”對象。


要處理不支持序列化為JSON的對象,可以使用自定義JSONEncoder 這是一個處理datetime.datetime對象的示例:

from datetime import datetime

class DateTimeAwareJSONEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, datetime):
            tz = obj.tzname()
            return obj.ctime() + (' {}'.format(tz) if tz else '')
        return super(DateTimeAwareJSONEncoder, self).default(obj)

for row in r.db(....).run(conn):
    print(json.dumps(row, indent=4, sort_keys=True, cls=DateTimeAwareJSONEncoder))

您可以使用datetime.strftime()根據需要格式化日期時間字符串。

mhawke的答案工作如果加上關鍵字參數time_format="raw"來RethinkDB的run()命令。 (否則,您會收到TypeError因為包含時區的RethinkDB對象不是JSON可序列化的)。 結果如下:

在此輸入圖像描述

這更容易辨認。 一個小缺點是epoch_time比原始時間格式更難解釋。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM