【问题标题】:python pretty print dictionary with multiline text in a value?python漂亮的打印字典,值中有多行文本?
【发布时间】:2016-09-03 21:46:13
【问题描述】:

这是一个带有 \n 值的字典:

d = {'trace': '\n\n##### Thread Stack Trace #####\n  File "/usr/lib/python2.7/threading.py", line 525, in __bootstrap\n    self.__bootstrap_inner()\n  File "/usr/lib/python2.7/threading.py", line 552, in __bootstrap_inner\n    self.run()\n  File "/usr/lib/python2.7/threading.py", line 505, in run\n    self.__target(*self.__args, **self.__kwargs)\n  File "/usr/local/test_virtualenv/local/lib/python2.7/site-packages/test/plugin.py", line 303, in run_forever\n    self.process()\n  File "/usr/local/test_virtualenv/local/lib/python2.7/site-packages/test/common.py", line 170, in execute\n    return func(*args, **kwargs)\n  File "/usr/local/test_virtualenv/local/lib/python2.7/site-packages/test_plugin/system/schedule.py", line 153, in process\n    self.sleep(delta_ts)\n  File "/usr/local/test_virtualenv/local/lib/python2.7/site-packages/test/plugin.py", line 292, in sleep\n    self.cancelled.wait(interval)\n  File "/usr/lib/python2.7/threading.py", line 404, in wait\n    self.__cond.wait(timeout)\n  File "/usr/lib/python2.7/threading.py", line 263, in wait\n    _sleep(delay)\n'}

想要漂亮地打印出来,但是当我尝试时

In [47]: print d
{'trace': '\n\n##### Thread Stack Trace #####\n  File "/usr/lib/python2.7/threading.py", line 525, in __bootstrap\n    self.__bootstrap_inner()\n  File "/usr/lib/python2.7/threading.py", line 552, in __bootstrap_inner\n    self.run()\n  File "/usr/lib/python2.7/threading.py", line 505, in run\n    self.__target(*self.__args, **self.__kwargs)\n  File "/usr/local/test_virtualenv/local/lib/python2.7/site-packages/test/plugin.py", line 303, in run_forever\n    self.process()\n  File "/usr/local/test_virtualenv/local/lib/python2.7/site-packages/test/common.py", line 170, in execute\n    return func(*args, **kwargs)\n  File "/usr/local/test_virtualenv/local/lib/python2.7/site-packages/test_plugin/system/schedule.py", line 153, in process\n    self.sleep(delta_ts)\n  File "/usr/local/test_virtualenv/local/lib/python2.7/site-packages/test/plugin.py", line 292, in sleep\n    self.cancelled.wait(interval)\n  File "/usr/lib/python2.7/threading.py", line 404, in wait\n    self.__cond.wait(timeout)\n  File "/usr/lib/python2.7/threading.py", line 263, in wait\n    _sleep(delay)\n'}

In [48]: import json

In [49]: print json.dumps(d, indent=4)
{
    "trace": "\n\n##### Thread Stack Trace #####\n  File \"/usr/lib/python2.7/threading.py\", line 525, in __bootstrap\n    self.__bootstrap_inner()\n  File \"/usr/lib/python2.7/threading.py\", line 552, in __bootstrap_inner\n    self.run()\n  File \"/usr/lib/python2.7/threading.py\", line 505, in run\n    self.__target(*self.__args, **self.__kwargs)\n  File \"/usr/local/test_virtualenv/local/lib/python2.7/site-packages/test/plugin.py\", line 303, in run_forever\n    self.process()\n  File \"/usr/local/test_virtualenv/local/lib/python2.7/site-packages/test/common.py\", line 170, in execute\n    return func(*args, **kwargs)\n  File \"/usr/local/test_virtualenv/local/lib/python2.7/site-packages/test_plugin/system/schedule.py\", line 153, in process\n    self.sleep(delta_ts)\n  File \"/usr/local/test_virtualenv/local/lib/python2.7/site-packages/test/plugin.py\", line 292, in sleep\n    self.cancelled.wait(interval)\n  File \"/usr/lib/python2.7/threading.py\", line 404, in wait\n    self.__cond.wait(timeout)\n  File \"/usr/lib/python2.7/threading.py\", line 263, in wait\n    _sleep(delay)\n"
}


In [50]: from pprint import pprint

In [51]: pprint(d)
{'trace': '\n\n##### Thread Stack Trace #####\n  File "/usr/lib/python2.7/threading.py", line 525, in __bootstrap\n    self.__bootstrap_inner()\n  File "/usr/lib/python2.7/threading.py", line 552, in __bootstrap_inner\n    self.run()\n  File "/usr/lib/python2.7/threading.py", line 505, in run\n    self.__target(*self.__args, **self.__kwargs)\n  File "/usr/local/test_virtualenv/local/lib/python2.7/site-packages/test/plugin.py", line 303, in run_forever\n    self.process()\n  File "/usr/local/test_virtualenv/local/lib/python2.7/site-packages/test/common.py", line 170, in execute\n    return func(*args, **kwargs)\n  File "/usr/local/test_virtualenv/local/lib/python2.7/site-packages/test_plugin/system/schedule.py", line 153, in process\n    self.sleep(delta_ts)\n  File "/usr/local/test_virtualenv/local/lib/python2.7/site-packages/test/plugin.py", line 292, in sleep\n    self.cancelled.wait(interval)\n  File "/usr/lib/python2.7/threading.py", line 404, in wait\n    self.__cond.wait(timeout)\n  File "/usr/lib/python2.7/threading.py", line 263, in wait\n    _sleep(delay)\n'}

以上所有方法都不起作用,如何漂亮地打印出来:

{u'trace': '''

##### Thread Stack Trace #####
  File "/usr/lib/python2.7/threading.py", line 525, in __bootstrap
    self.__bootstrap_inner()
  File "/usr/lib/python2.7/threading.py", line 552, in __bootstrap_inner
    self.run()
  File "/usr/lib/python2.7/threading.py", line 505, in run
    self.__target(*self.__args, **self.__kwargs)
  File "/usr/local/test_virtualenv/local/lib/python2.7/site-packages/test/plugin.py", line 389, in run_forever
    self.sleep(wait_time)
  File "/usr/local/test_virtualenv/local/lib/python2.7/site-packages/test/plugin.py", line 292, in sleep
    self.cancelled.wait(interval)
  File "/usr/lib/python2.7/threading.py", line 404, in wait
    self.__cond.wait(timeout)
  File "/usr/lib/python2.7/threading.py", line 263, in wait
    _sleep(delay)

'''
}

【问题讨论】:

  • 您的漂亮打印预期输出不是有效的 Python 或 JSON 语法,这是其他格式产生的。您可以将输出显示为三引号字符串,但我不知道有任何 已经可用的 函数或库可以产生这个。

标签: python json python-2.7 dictionary


【解决方案1】:

一个简单的两行代码可以用你的字典为你完成工作,包括值中的 \n。

def print_dict(d):
    str= '{'
    for k,v in d.items():
        str+="\n\'{}\' : {}".format( k,v)
    str+= '}'
    print str

另一种使用 python 内置库 pprint 进行漂亮打印的方法。

import pprint
print pprint.pformat(dict_object)

其他方法是覆盖 dict 对象的 print 方法。

这些答案可能会对您有所帮助。

How to "perfectly" override a dict?

Subclassing Python dictionary to override __setitem__

【讨论】:

    【解决方案2】:

    假设它没有嵌套,你可以这样做:

    def my_pprint(d):
        print "{" + ",\n".join("{}: '{}'".format(repr(k), v) for k,v in d.items()) + "}"
    

    【讨论】:

      猜你喜欢
      • 2020-11-10
      • 2015-01-12
      • 2021-07-30
      • 1970-01-01
      • 2017-02-22
      • 2016-11-26
      • 2014-05-12
      • 1970-01-01
      相关资源
      最近更新 更多