【问题标题】:How to pretty print dictionaries in iPython如何在 iPython 中漂亮地打印字典
【发布时间】:2017-02-22 10:27:17
【问题描述】:

我目前正在使用 RethinkDB,它有一个漂亮的 Web UI 和一个 Data Explorer,它允许用户像这样打印出数据库的内容:

请注意,每个键值对都从新行开始,并且键和值(大部分)具有不同的颜色。相比之下,如果我使用 iPython 打印出同样的内容,我会得到几乎难以辨认的结果:

如果我遍历光标和 print 每个项目,这会稍微有所改善,如下所示:

但是,这需要更多的输入,而且看起来仍然不如 RethinkDB Web UI。是否有我可以安装的 iPython 插件来改善打印输出的外观?

(我看过pprint,但这似乎只控制文本的位置而不是它的颜色)。

【问题讨论】:

标签: python rethinkdb


【解决方案1】:

你可以使用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()格式化日期时间字符串。

【讨论】:

  • 如果需要,您可以使用 json.dumps 和参数 sort_keys=True 对键进行排序 ...
  • 这不适用于具有非 JSON 可序列化对象的字典,例如Decimal.
  • @ChrisAnderson:所以为Decimal 编写一个自定义JSON 编码器,正如我为datetime 对象所展示的那样。
【解决方案2】:

如果将关键字参数time_format="raw" 添加到RethinkDB 的run() 命令中,mhawke 的答案就有效。 (否则,你会得到一个TypeError,因为 RethinkDB 的包含时区的对象不是 JSON 可序列化的)。结果如下所示:

这更清晰。一个小缺点是epoch_time 比原始时间格式更难解释。

【讨论】:

  • 您可以使用自定义JSONEncoder 来处理datetime 对象。请参阅我的更新答案。
猜你喜欢
  • 2011-03-14
  • 2014-01-25
  • 2020-10-23
  • 2020-11-10
  • 2015-01-12
  • 2021-07-30
  • 1970-01-01
  • 2022-11-18
相关资源
最近更新 更多