pprint():如何使用双引号显示字符串?

27

如果我使用pprint打印字典,它总是用单引号(')包裹字符串:

>>> from pprint import pprint
>>> pprint({'AAA': 1, 'BBB': 2, 'CCC': 3})
{'AAA': 1, 'BBB': 2, 'CCC': 3}

有没有办法告诉pprint使用双引号(")?我希望有以下行为:
>>> from pprint import pprint
>>> pprint({'AAA': 1, 'BBB': 2, 'CCC': 3})
{"AAA": 1, "BBB": 2, "CCC": 3}

3
为什么需要用双引号?pprint() 函数只是使用字符串的 repr() 结果,除非包含文字 ' 引号,否则将使用单引号。 - Martijn Pieters
2
也许你想使用 json.dumps()?JSON 使用双引号表示字符串... - Martijn Pieters
谢谢@Martijn,json.dumps()正是我需要的。你能把它发表为答案吗? - E.Z.
3个回答

44

看起来你正在尝试生成JSON数据,如果是的话,请使用json模块

>>> import json
>>> print json.dumps({'AAA': 1, 'BBB': 2, 'CCC': 3})
{"AAA": 1, "BBB": 2, "CCC": 3}

pprint()函数生成的是Python表示形式,而不是JSON格式。引号样式不可配置。请不要混淆这两种语法。JSON看起来可能与Python很相似,但区别不止于引号样式:

  • JSON仅限于一些特定类型({...} 对象,包含键值对,[...] 数组,"..." 字符串,数字,布尔和null)。 Python数据结构更加丰富。
  • Python字典键可以是任何可哈希对象,JSON对象键只能是字符串。
  • JSON布尔值写成小写,truefalse。Python使用首字母大写,TrueFalse
  • JSON使用null来表示缺少值,Python使用None
  • JSON字符串使用UTF-16代码点,任何非BMP代码点都会采用代理对进行编码。除了一些单字符反斜杠转义如\n\"之外,任意代码点逃逸序列使用\uXXXX 16位十六进制表示法。Python 3字符串覆盖了Unicode的所有内容,语法支持\xXX\uXXXX\UXXXXXXXX 8、16和32位逃脱序列。

如果您想生成缩进的JSON输出(有点像pprint()输出缩进的Python语法用于列表和字典),那么请将indent=4sort_keys=True添加到json.dumps()调用中:

>>> print json.dumps({'AAA': 1, 'CCC': 2, 'BBB': 3}, indent=4, sort_keys=True)
{
    "AAA": 1,
    "BBB": 2,
    "CCC": 3
}

请参考这里,了解如何使用Python美化JSON文件。


4
这修复了单引号->双引号,但对于手动查看来说不够用,因为它没有漂亮地打印输出。 - travelingbones
@travelingbones 的观点是,原帖作者试图生成 JSON,但使用了错误的工具。他们实际上并不是在尝试漂亮地打印输出!话虽如此,json.dumps() 函数可以配置为在一定程度上进行漂亮的打印输出。 - Martijn Pieters
2
我明白。我也遇到了同样的问题,但我需要两者--我需要手动读取输出的json,并将其插入到接受.json格式的某些内容中。我只是想包含我发现的信息--这确实将单引号切换为双引号,但不会美化它。 - travelingbones
4
要查看格式化后的JSON,请访问https://dev59.com/pmcs5IYBdhLWcg3wUCYI。但是,这并不是本答案的重点。 - Martijn Pieters
检查一下。从我的最初评论中可以清楚地看出您已回答了原始问题。为了结束此话题,我认为这个答案https://dev59.com/pmcs5IYBdhLWcg3wUCYI使用了您的解决方案,并附带一个缩进参数以帮助查看。 - travelingbones
显示剩余2条评论

0

我看到原帖想要JSON,但我不需要JSON,pprint几乎可以给我我想要的东西:black兼容的Python源代码,这需要我使用"而不是'

我最终选择了.replace("'", '"')pformat()一起使用,尽管这既丑陋又脆弱☹️:

import pprint

# Note: my code auto-generates my_dict parsing a file (not black-formatted here)
my_dict = ["spam", "eggs", "lumberjack", "knights", "ni", "eggs", "lumberjack", "knights", "ni"]

pprinter = pprint.PrettyPrinter(indent=4)
formatted_code = (
    pprinter.pformat(my_dict)
    .replace("[ ", "[\n  ")  # break after opening bracket
    .replace("']", "',\n]")  # break before closing bracket, add comma
    .replace("'", '"')  # use double quotes
)
with open("example_module.py", "w", encoding="utf-8") as outfile:
    outfile.write('"""Module containing auto-generated ALL_MR_HEADERS."""\n')
    outfile.write(f"ALL_MR_HEADERS = {formatted_code}\n")

生成的 example_module.py 符合 black 格式。


0

虽然我反对在简单的事情上使用模块,但随着时间的推移,pprint变得无用,并且没有跟上Python 3的发展。至少他们可以将此选项作为参数添加。

因此,利用black模块已经以漂亮的格式打印出您的对象。

以下是代码:

import black
print(black.format_file_contents(str(D), fast=False, mode=black.FileMode()))

将会打印

 '{"AAA": 1, "BBB": 2, "CCC": 3}'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接