如何在iPython

时间:2016-10-13 10:34:45

标签: python rethinkdb

我目前正在使用RethinkDB,它有一个很好的Web UI和一个Data Explorer,允许用户打印出数据库的内容,如下所示:

enter image description here

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

enter image description here

如果我迭代光标并print每个项目,这会稍微改善一下,如下所示:

enter image description here

但是,这需要更多打字,但仍然不如RethinkDB Web UI。是否可以安装一个iPython插件来改善打印输出的外观?

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

如果将关键字参数time_format="raw"添加到RethinkDB的run()命令,则

mhawke的答案有效。 (否则,您得到TypeError,因为包含时区的RethinkDB对象不是JSON可序列化的。结果如下:

enter image description here

更容易辨认。一个小缺点是epoch_time比原始时间格式更难解释。