如何在 iPython 中漂亮地打印字典
How to pretty print dictionaries in iPython
我目前正在使用 RethinkDB,它有一个很好的 Web UI 和一个数据浏览器,它允许用户像这样打印出数据库的内容:
请注意,每个 key-value 对都在一个新行开始,并且键和值(大部分)具有不同的颜色。相比之下,如果我使用 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)
这也可能会打印出周围的 "list" 对象。
要处理不支持序列化为 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()
格式化日期时间字符串。
如果将关键字参数 time_format="raw"
添加到 RethinkDB 的 run()
命令,mhawke 的答案就会起作用。 (否则,您会得到一个 TypeError
,因为包含时区的 RethinkDB 对象不是 JSON 可序列化的)。结果如下所示:
这样更清晰。一个小缺点是 epoch_time
比原始时间格式更难解释。
我目前正在使用 RethinkDB,它有一个很好的 Web UI 和一个数据浏览器,它允许用户像这样打印出数据库的内容:
请注意,每个 key-value 对都在一个新行开始,并且键和值(大部分)具有不同的颜色。相比之下,如果我使用 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)
这也可能会打印出周围的 "list" 对象。
要处理不支持序列化为 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()
格式化日期时间字符串。
time_format="raw"
添加到 RethinkDB 的 run()
命令,mhawke 的答案就会起作用。 (否则,您会得到一个 TypeError
,因为包含时区的 RethinkDB 对象不是 JSON 可序列化的)。结果如下所示:
这样更清晰。一个小缺点是 epoch_time
比原始时间格式更难解释。