2026年Python如何读写JSON格式文件_使用json模块自带的dump与load方法

Python如何读写JSON格式文件_使用json模块自带的dump与load方法p p 用 json dump 写文件 json load 读文件 必须配对使用 open 的 w 和 r 模式 注意编码和数据类型限制 直接说结论 用 json dump 写文件 json load 读文件 但必须配对使用 open 的正确模式 w amp

大家好,我是讯享网,很高兴认识大家。这里提供最前沿的Ai技术和互联网信息。



 

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

python如何读写json格式文件_使用json模块自带的dump与load方法 - php中文网

直接说结论:用 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'

对应关系要记牢:dumploaddumpsloadss 结尾代表 string。

json 模块只认有限的几种类型,遇到不支持的会报 TypeError: Object of type X is not JSON serializable

  • 常见不支持类型:datetimeset、自定义 class 实例、bytesNone(等等,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 的核心概念和高级技巧!



小讯
上一篇 2026-04-26 16:01
下一篇 2026-04-26 15:59

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/281351.html