【问题标题】:Pretty-printing JSON with ASCII color in pythonpython中带有ASCII颜色的漂亮打印JSON
【发布时间】:2014-10-20 06:38:18
【问题描述】:

我正在寻找使用 ASCII 颜色在 python 中将 JSON 打印到命令行。例如,(优秀的)jq 实用程序将使用粗体 ASCII 颜色对 JSON 进行着色,如下所示:

  • 输入:curl --silent http://coinabul.com/api.php | jq .
  • 输出:

有谁知道如何通过 Python 实现这种效果?几个 SO 问题提供了一些关于在 python 中使用 ASCII 颜色的好信息(例如Print in terminal with colors using Python?),但我认为这种效果需要以不同的方式将漂亮的印刷机器与着色机器结合起来。

【问题讨论】:

    标签: python json pretty-print


    【解决方案1】:

    使用Pygments库:

    import json
    from pygments import highlight
    from pygments.lexers import JsonLexer
    from pygments.formatters import TerminalFormatter
    
    json_object = json.loads('{"foo":"bar"}')
    json_str = json.dumps(json_object, indent=4, sort_keys=True)
    print(highlight(json_str, JsonLexer(), TerminalFormatter()))
    

    【讨论】:

    • 我必须像这样导入:from pygments.lexers.data import JsonLexerfrom pygments.formatters.terminal import TerminalFormatter
    • TerminalFormatter() 也有样式选项,例如TerminalFormatter(style='monokia')。如何查看所有样式名称的列表以便我可以尝试
    【解决方案2】:

    这应该让你开始(它以蓝色打印键):

    import json
    import urllib2
    
    # ANSI color terminal escape sequences
    OKBLUE = '\033[94m'
    ENDC = '\033[0m'
    
    def pretty(keyvals, indent=''):
        print '{'
        for key, val in keyvals.iteritems():
            print '{}  {}"{}"{}:'.format(indent, OKBLUE, key, ENDC),
            if isinstance(val, dict):
                pretty(val, indent + '  ')
            elif isinstance(val, str):
                print '"{}",'.format(val)
            else:
                print '{},'.format(val)
        print indent + '},'
    
    req = urllib2.Request('http://coinabul.com/api.php', headers={
            'User-Agent': 'Mozilla/5.0',
            })
    
    page = urllib2.urlopen(req)
    parsed = json.load(page)
    
    pretty(parsed)
    

    【讨论】:

    • 如果可以避免重新发明所有漂亮的打印(缩进)逻辑,那就太好了。
    • 好吧,你可以使用json.dumps(parsed, indent=2),然后解析它给你的文本并着色......我认为这更糟(更容易出错等)。如果您正在寻找的是一个为您完成所有这些工作的库,那么我认为它不存在。
    【解决方案3】:

    使用https://github.com/willmcgugan/rich

    from rich.console import Console
    from rich.theme import Theme
    from rich.highlighter import RegexHighlighter, _combine_regex
    my_theme = Theme(
        {
            "repr.str": "bright_blue",
            "repr.value_str": "green",
        }
    )
    
    class ReprHighlighter(RegexHighlighter):
        """Highlights the text typically produced from ``__repr__`` methods."""
    
        base_style = "repr."
        highlights = [
            r"(?P<tag_start>\<)(?P<tag_name>[\w\-\.\:]*)(?P<tag_contents>[\w\W]*?)(?P<tag_end>\>)",
            r"(?P<attrib_name>[\w_]{1,50})=(?P<attrib_value>\"?[\w_]+\"?)?",
            r"(?P<brace>[\{\[\(\)\]\}])",
            _combine_regex(
                r"(?P<ipv4>[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})",
                r"(?P<ipv6>([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4})",
                r"(?P<eui64>(?:[0-9A-Fa-f]{1,2}-){7}[0-9A-Fa-f]{1,2}|(?:[0-9A-Fa-f]{1,2}:){7}[0-9A-Fa-f]{1,2}|(?:[0-9A-Fa-f]{4}\.){3}[0-9A-Fa-f]{4})",
                r"(?P<eui48>(?:[0-9A-Fa-f]{1,2}-){5}[0-9A-Fa-f]{1,2}|(?:[0-9A-Fa-f]{1,2}:){5}[0-9A-Fa-f]{1,2}|(?:[0-9A-Fa-f]{4}\.){2}[0-9A-Fa-f]{4})",
                r"(?P<call>[\w\.]*?)\(",
                r"\b(?P<bool_true>True)\b|\b(?P<bool_false>False)\b|\b(?P<none>None)\b",
                r"(?P<ellipsis>\.\.\.)",
                r"(?P<number>(?<!\w)\-?[0-9]+\.?[0-9]*(e[\-\+]?\d+?)?\b|0x[0-9a-fA-F]*)",
                r"(?P<path>\B(\/[\w\.\-\_\+]+)*\/)(?P<filename>[\w\.\-\_\+]*)?",
                r":(?<![\\\w]) (?P<value_str>b?\'\'\'.*?(?<!\\)\'\'\'|b?\'.*?(?<!\\)\'|b?\"\"\".*?(?<!\\)\"\"\"|b?\".*?(?<!\\)\")",
                r"(?<![\\\w])(?P<str>b?\'\'\'.*?(?<!\\)\'\'\'|b?\'.*?(?<!\\)\'|b?\"\"\".*?(?<!\\)\"\"\"|b?\".*?(?<!\\)\")",
                r"(?P<uuid>[a-fA-F0-9]{8}\-[a-fA-F0-9]{4}\-[a-fA-F0-9]{4}\-[a-fA-F0-9]{4}\-[a-fA-F0-9]{12})",
                r"(?P<url>(https|http|ws|wss):\/\/[0-9a-zA-Z\$\-\_\+\!`\(\)\,\.\?\/\;\:\&\=\%\#]*)",
            ),
        ]
    
    
    console = Console(theme=my_theme, highlighter=ReprHighlighter())
    json_str = json.dumps(json_object, indent=4, sort_keys=True)
    console.print(json_str)
    

    只有value_str 被添加到ReprHighlighter

    【讨论】:

      猜你喜欢
      • 2014-05-12
      • 2014-05-19
      • 2013-12-07
      • 1970-01-01
      • 1970-01-01
      • 2011-07-02
      • 2014-07-06
      • 2017-11-03
      相关资源
      最近更新 更多