用json.dump()写文件、json.load()读文件,必须配对使用open()的”w”和”r”模式,注意编码和数据类型限制。

直接说结论:用 json.dump() 写文件、json.load() 读文件,但必须配对使用 open() 的正确模式("w" 和 "r"),且注意编码和数据类型限制。
常见原因是没关文件,或用了错误的打开模式:
-
json.dump(obj, f)要求f是可写的文本流,必须用open(..., "w", encoding="utf-8")—— 不能用"wb"(那是二进制模式,json.dump()会报TypeError: expected str, bytes or os.PathLike object) - 忘记调用
f.close()或没用with语句,内容可能滞留在缓冲区,导致文件为空或不完整 - 中文默认会转成 Unicode 转义(如
"你"),想保留原字符得加参数ensure_ascii=False
推荐写法:
import json data = {"name": "张三", "score": 95} with open("info.json", "w", encoding="utf-8") as f: json.dump(data, f, ensure_ascii=False, indent=2)
这个错误几乎都来自文件内容不符合 JSON 语法,不是代码写错了:
- 文件为空 → 先检查
os.path.getsize("xxx.json")是否为 0 - 文件里有多余逗号(如
{"a":1,})、单引号代替双引号({'a':1})、注释(// xxx)→ JSON 不支持这些,Python 的json模块严格遵循标准 - 文件是用
json.dumps()直接拼字符串写入(没换行),但后续又手动编辑过 → 极易引入不可见字符(如 BOM、全角空格) - 编码不一致 → 用
encoding="utf-8"打开,但文件实际是 GBK 编码 → 会解码失败,报错信息里常带UnicodeDecodeError前置错误
安全读取建议:
import json try: with open("info.json", "r", encoding="utf-8") as f: data = json.load(f) except json.JSONDecodeError as e: print(f"JSON 解析失败,位置 {e.pos}:{e.msg}") except FileNotFoundError: print("文件不存在")
核心区别在于「是否操作磁盘文件」:
-
json.dump()/json.load():专用于文件对象(TextIO),第一个参数是 Python 对象,第二个是打开的文件句柄 -
json.dumps()/json.loads():处理字符串,返回或接收str,不碰文件系统。比如网络传输、缓存、调试打印时用
别混用:
- ❌
json.dump(data, "file.json")—— 第二个参数不是文件对象,会报AttributeError: 'str' object has no attribute 'write' - ❌
json.load("{'a':1}")—— 传的是字符串不是文件对象,会报AttributeError: 'str' object has no attribute 'read'
对应关系要记牢:dump→load,dumps→loads;s 结尾代表 string。
json 模块只认有限的几种类型,遇到不支持的会报 TypeError: Object of type X is not JSON serializable:
- 常见不支持类型:
datetime、set、自定义 class 实例、bytes、None(等等,None其实可以,对应 JSON 的null) -
tuple会被转成list,一般无感;但set直接报错 - 解决方法:用
default参数提供转换函数,例如把datetime转成 ISO 字符串
示例(处理 datetime):
import json from datetime import datetimedata = {"time": datetime.now()} json_str = json.dumps(data, default=str) # 或更精确地:lambda o: o.isoformat() if isinstance(o, datetime) else None
真正容易被忽略的是:即使你只处理字典和列表,如果其中某个值是 numpy.int64 或 Pandas Timestamp,也会同样报错——它们不是内置类型,json 模块不认识。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/281351.html