pprint.pprint()不能直接写入文件,因其默认输出到sys.stdout且不返回字符串;必须用pprint.pformat()生成字符串后配合write(),而json.dump()才是生产环境写入标准JSON文件的首选方法。

直接结论:用 json.dump() 写入结构清晰、跨语言可读的文本文件最稳妥;pprint.pprint() 仅适合调试或人工阅读,不能直接写入文件,必须配合 pprint.pformat() + write() 才能落地。
为什么不能直接用 pprint.pprint() 写文件
pprint.pprint() 默认输出到 sys.stdout,它不返回字符串,而是直接打印——这意味着你无法把它塞进 f.write()。常见错误是这样写:
import pprint
with open("data.txt", "w") as f:
pprint.pprint({"a": [1, 2], "b": {"x": True}}, f) # ❌ 看似合理,但 f 是文件对象,pprint 不接受它作为 target 参数(Python 3.8+ 已弃用该用法)实际会触发 TypeError: pprint() got an unexpected keyword argument 'stream' 或静默失败(旧版本)。真正可用的是:
-
pprint.pformat():返回格式化后的str,可安全传给f.write() -
pprint.PrettyPrinter(indent=2).pformat(...):可自定义缩进、宽度等
json.dump() 是生产环境首选
它原生支持嵌套字典、列表、基础类型(str, int, float, bool, None),输出紧凑且标准。注意以下限制和适配点:
立即学习“Python免费学习笔记(深入)”;
图片提示词生成器?不止如此。 马甲系统 —— 把脑海中的画面,翻译成AI能理解的专业表达。 用得越多,它越懂你:首次需要多问几句确认方向,用久了几乎一说就懂。 用得越多,它越快:缓存机制让后续对话越来越省。 RAG进化:成功案例持续入库,越跑越聪明。 输入「新手指南」查看完整功能介绍
- 字典键必须是
str类型,json.dump()会自动调用str()转换非字符串键,但结果不可逆(比如{(1,2): "v"}会变成{"(1, 2)": "v"}) - 不支持
datetime、set、自定义类等类型,会报TypeError: Object of type ... is not JSON serializable - 推荐加参数
indent=2提高可读性,ensure_ascii=False保留中文(否则转成\u4f60\u597d)
示例:
import json
data = {"name": "张三", "scores": [89, 92], "active": True}
with open("data.json", "w", encoding="utf-8") as f:
json.dump(data, f, indent=2, ensure_ascii=False)什么时候该选 pprint.pformat()
当你需要保留 Python 特有类型(如 set, tuple, complex)、或调试时想一眼看出对象 identity(比如 <__main__.Person object at 0x...>)、或结构极深且含大量重复引用(pprint 自动处理循环引用)时,pformat() 更贴近开发视角。
但它输出的是 Python 字面量语法,不是标准数据交换格式——其他语言没法直接解析,文件里还可能混入单引号、True/False(JSON 要求 true/false)。
正确写法示例:
import pprint
data = {"items": (1, 2, 3), "meta": {4, 5}}
with open("debug.txt", "w", encoding="utf-8") as f:
f.write(pprint.pformat(data, indent=2, width=60))真正容易被忽略的是编码和换行:无论用哪种方式,都必须显式指定 encoding="utf-8",否则 Windows 上默认 cp1252 会崩中文;pformat() 结尾不带换行符,json.dump() 也不带,如果希望文件末尾有空行,得手动 f.write("\n")。

















