json.load()必须传入文件对象而非路径字符串,正确用法是with open()打开文件后传入;需注意编码、异常处理、数据类型限制及大文件解析性能问题。

用 json.load() 读取文件时,传进去的必须是文件对象
很多人直接把路径字符串传给 json.load(),结果报错:TypeError: expected str, bytes or os.PathLike object, not _io.TextIOWrapper —— 其实这是混淆了 json.load() 和 json.loads()。
json.load() 的作用是从「已打开的文件对象」里解析 JSON;json.loads() 才是解析字符串。所以得先用 open() 打开文件,再把文件对象传进去。
- 正确写法:
with open("data.json", "r", encoding="utf-8") as f: data = json.load(f) - 错误写法:
json.load("data.json")(会报错) - 如果已经拿到 JSON 字符串(比如从网络请求来),才用
json.loads(my_str) - 记得加
encoding="utf-8",否则中文可能乱码(尤其 Windows 默认用 GBK)
文件不存在或格式错误时,json.load() 会直接抛异常
不是返回 None 或空字典,而是抛出 FileNotFoundError 或 json.JSONDecodeError。不捕获的话程序就崩了。
-
FileNotFoundError:路径写错、文件没放对位置、拼写大小写不对(Linux/macOS 区分大小写) -
json.JSONDecodeError:JSON 格式非法,比如末尾多逗号、单引号代替双引号、中文标点、BOM 头残留 - 建议加基础异常处理:
try: with open("config.json", "r", encoding="utf-8") as f: config = json.load(f) except FileNotFoundError: print("配置文件不存在") except json.JSONDecodeError as e: print(f"JSON 解析失败:{e.msg}(第{e.lineno}行第{e.colno}列)")
读出来的数据类型是 Python 原生结构,但要注意嵌套和特殊值
json.load() 返回的是标准 Python 对象:对象 → dict,数组 → list,字符串 → str,数字 → int 或 float,null → None。但它不会自动转成 datetime、Decimal 这类自定义类型。
立即学习“Python免费学习笔记(深入)”;
- JSON 里
"2024-06-01"读出来还是字符串,不是date对象 - 浮点数精度可能有微小偏差(比如
0.1 + 0.2 != 0.3),JSON 本身不存精度信息 - 如果 JSON 含有注释、尾随逗号、
NaN或Infinity,Python 的json模块会拒绝解析(标准 JSON 不支持这些) - 需要自定义反序列化逻辑(比如把某个字段当日期处理),得用
object_hook参数
大文件别用 json.load() 一次性加载
几 MB 以上的 JSON 文件,全读进内存再解析,容易触发 MemoryError,而且启动慢。这时候得换思路。
- 纯文本小改可用
jq命令行工具预处理(如提取某字段),再喂给 Python - 真正的大 JSON(如日志流、导出数据),考虑用
ijson库做流式解析,只取关心的键路径 -
json.load()内部会先把整个文件读成字符串再解析,所以即使文件只有 10MB,内存占用可能翻倍 - 如果只是查一两个字段,先用
grep或正则粗筛(不推荐用于嵌套结构),比全量解析快得多
datetime 或 set。










