应使用json.load()解析、修改字典后json.dump()写回,避免字符串替换;处理嵌套用.get()链式调用,批量修改用递归或reduce;多文件操作用pathlib.glob(),写入后必须用json.loads()校验。

直接改 json 文件内容,别用字符串替换
用 str.replace() 或正则去“搜关键词改值”看似快,但极易破坏 JSON 结构:字段名重复、嵌套层级错位、引号逃逸失效、注释(哪怕只是临时加的)导致解析失败。JSON 是结构化数据,必须走标准解析→修改→序列化流程。
实操建议:
将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
- 用
json.load()读取为 Python 字典/列表,确保格式合法;遇到JSONDecodeError先检查文件是否真为纯 JSON(无注释、无尾逗号) - 修改时优先用键访问(
data["host"] = "127.0.0.1"),避免遍历全树——除非你要批量改所有同名字段 - 写回时用
json.dump(data, f, indent=2),indent保持可读性,避免覆盖原文件前先备份(比如写到config.json.bak)
处理多层嵌套字段,用 dict.get() 和递归安全取值
配置里常见 "database": {"host": "old.com", "port": 5432} 这类结构。硬写 data["database"]["host"] 会因某层缺失直接报 KeyError。
实操建议:
- 用链式
.get():data.get("database", {}).get("host"),比try/except更简洁 - 要批量改深层字段(如所有
"timeout"),写个递归函数,但限定只改叶子节点(isinstance(value, (str, int, float, bool, type(None)))),跳过 list/dict 容器本身 - 如果字段路径固定且已知(如
["api", "auth", "token"]),用functools.reduce(dict.get, path, data)安全取值,再反向赋值
批量处理多个文件,用 pathlib 扫描 + glob 匹配
别手写 os.listdir() 加字符串拼接路径,容易出错且跨平台不兼容。
实操建议:
- 用
pathlib.Path("configs/").glob("*.json")获取所有 JSON 文件路径对象,天然支持 Windows/Linux 路径分隔符 - 对每个
file,用file.read_text()读内容,file.write_text(new_content)写回,比 open+编码更省心 - 加个简单过滤:
if "template" not in file.name,跳过模板文件,避免误改
修改后校验是否生效,加一行 json.loads(file.read_text()) 回读
写完不验证,等于没改。常见坑是:中文乱码(没指定 encoding="utf-8")、浮点数精度丢失(json.dump 默认不保留小数位)、布尔值被转成字符串(手动拼了 "true" 而非 True)。
实操建议:
- 写入后立即用
json.loads(file.read_text(encoding="utf-8"))尝试解析,捕获异常并打印文件名,快速定位坏文件 - 对比修改前后关键字段值(如
old_data["version"] != new_data["version"]),防止静默失败 - 如果配置会被其他程序热加载,改完 sleep(0.1) 再触发 reload,避免读到半截文件
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










