configparser 是修改 ini 配置文件最稳妥的方式,能保留言尾注释、节序和空行;需禁用插值、原子写入、显式编码,并避免直接字符串替换以防格式破坏。

用 configparser 修改 INI 风格配置文件最稳妥
直接字符串替换 .ini 或 .cfg 文件极容易破坏格式(比如注释缩进、空行、多行值),configparser 是 Python 标准库中专为此类结构化配置设计的工具,能保留言尾注释、节头顺序和原始空行(Python 3.7+ 支持)。
实操要点:
- 务必使用
configparser.ConfigParser(interpolation=None),禁用插值可避免把%或$开头的值误解析为变量 - 读取时用
read()而非read_file(),前者会静默跳过不存在的文件,适合初始化场景 - 写入前调用
config.write()到临时文件,确认无误再原子替换原文件,防止写到一半崩溃导致配置损坏 - 若配置项值含换行符,需用三引号包裹或启用
allow_no_value=True配合set()手动处理
JSON 配置文件优先选 json 模块 + 原子写入
JSON 不支持注释,但结构清晰、语言无关,json 模块天然防格式错乱。关键不是“怎么改”,而是“改完怎么不丢数据”。
常见翻车点:
- 直接
open(..., 'w').write(json.dumps(...))—— 若序列化失败(如含datetime),原文件已被清空 - 没设
indent=2和sort_keys=False,导致 diff 全是格式变动,掩盖真实修改 - 忽略编码:必须显式指定
encoding='utf-8',否则 Windows 下中文变乱码
安全写法示例:
import json import tempfile import os <p>def update_json_config(path, updates): with open(path, encoding='utf-8') as f: data = json.load(f) data.update(updates) with tempfile.NamedTemporaryFile(mode='w', delete=False, encoding='utf-8') as tmp: json.dump(data, tmp, indent=2, ensure_ascii=False) os.replace(tmp.name, path) # 原子替换</p>
YAML 配置必须用 PyYAML 的 safe_load 和 safe_dump
别用 yaml.load() —— 它默认启用任意代码执行,配置文件若被恶意篡改,加载即触发远程命令执行(RCE)。生产环境出过真实漏洞。
正确姿势:
- 始终用
yaml.safe_load()解析,它只支持基础类型(str/int/list/dict/None/bool) - 写入时加
default_flow_style=False保持块状风格,避免{key: value}这种紧凑格式干扰人工阅读 - 若配置含自定义标签(如
!include),需注册对应构造器,否则safe_load会报yaml.constructor.ConstructorError - 注意
safe_dump默认不保留锚点(anchors)和别名(aliases),若配置依赖 YAML 引用机制,得换yaml.dump(..., Dumper=yaml.CDumper)
正则替换仅限无结构文本,且必须加边界锚定
当配置文件是纯 key=value 文本(如 .env)、或格式混乱无法用标准解析器时,才考虑正则。但极易误匹配——比如把 DB_HOST=127.0.0.1 中的 HOST 当成独立关键词替换成其他值。
安全底线:
- 正则必须用
^和$锚定整行,例如r'^DB_HOST=.*$',避免匹配到注释行或值中的子串 - 替换时用
re.sub(..., count=1)限定只改第一个匹配,防止某 key 在文件里重复出现引发意外覆盖 - 永远先用
re.findall()扫描一遍,确认匹配结果符合预期再执行替换 - 若值含特殊字符(如
\、$),需对新值调用re.escape()再拼接,否则正则语法报错
真正难的不是写替换逻辑,而是判断该不该用替换——多数所谓“简单配置”背后藏着隐式结构(比如某 key 的值其实是 JSON 片段),贸然正则会把合法内容当普通字符串切碎。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











