pprint 字典在多行

Posted

技术标签:

【中文标题】pprint 字典在多行【英文标题】:pprint dictionary on multiple lines 【发布时间】:2013-12-08 21:35:07 【问题描述】:

我正试图获得一本漂亮的字典,但我没有运气:

>>> import pprint
>>> a = 'first': 123, 'second': 456, 'third': 1:1, 2:2
>>> pprint.pprint(a)
'first': 123, 'second': 456, 'third': 1: 1, 2: 2

我希望输出多行,如下所示:

'first': 123,
 'second': 456,
 'third': 1: 1,
           2: 2

pprint 可以这样做吗?如果不是,那么它是哪个模块?我正在使用Python 2.7.3。

【问题讨论】:

这能回答你的问题吗? How to pretty print nested dictionaries? @Georgy 不完全是。该问题中所需的输出与我在这里的输出不同 【参考方案1】:

使用width=1width=-1

In [33]: pprint.pprint(a, width=1)
'first': 123,
 'second': 456,
 'third': 1: 1,
           2: 2

【讨论】:

负宽度有什么作用? @Tim:我刚试了一下,效果很好,但我不知道这是否记录在某个地方。 负宽度没有什么特别的作用。随着代码的进行,它会检查部分输出字符串的长度是否为< width。任何负宽度仅意味着答案将始终为“否”。宽度为 0 几乎总是(或者可能总是 - 我不在乎考虑反常的情况;-))做同样的事情。 @TimPeters:是的,我查看了源代码。对 width==0 进行了检查(它会引发错误),但似乎可以将 0 视为负值 - 正如你所说的那样,始终回答“否” - 没有害处。跨度> 【参考方案2】:

您可以通过json.dumps(d, indent=4)将dict转换为json

import json

print(json.dumps(item, indent=4))

    "second": 456,
    "third": 
        "1": 1,
        "2": 2
    ,
    "first": 123

【讨论】:

比其他解决方案漂亮得多 @ErikAronesty 虽然您应该注意null 和布尔值(真/假)。它们是 JSON 值而不是 python 对象。 简单情况的好的解决方案,但是将 python 值转换为 json 值(正如@RyanChou 指出的那样),它可能不是可取的或不可能的(如datetime):json.dumps('d': datetime.now()) 将崩溃Object of type datetime is not JSON serializable. NameError: name 'json' is not defined - 这是一个需要导入的模块吗?如果是这样,您介意更新您的答案以反映这一点吗?【参考方案3】:

如果您想漂亮地打印环境变量,请使用:

pprint.pprint(dict(os.environ), width=1)

【讨论】:

【参考方案4】:

在 Ryan Chou 已经非常有帮助的答案的基础上添加两点:

传递sort_keys 参数,以便更轻松地了解您的字典,尤其是。如果您使用的是 3.6 之前的 Python(其中的字典是无序的)
print(json.dumps(item, indent=4, sort_keys=True))
"""

    "first": 123,
    "second": 456,
    "third": 
        "1": 1,
        "2": 2
    

"""
dumps() 仅在字典键是原语(字符串、int 等)时才有效

【讨论】:

整洁! sort_keys 是一个很好的论点。不幸的是,正如你所说,并不总是适用:TypeError: Object of type Tag is not JSON serializable...

以上是关于pprint 字典在多行的主要内容,如果未能解决你的问题,请参考以下文章

如何将在多行中具有相同键的字典转换为数据框[重复]

python 在多行上访问嵌套字典的最佳PEP-8实践是什么?

如何从字典中选择多行(executemany select)

介绍一个非常好用的Python模块-pprint模块,相信你一定会爱上它的

多行文本文件转列表解析成字典方法

Replace() 不适用于多行字符串和大括号