configparser能读写标准ini文件,但默认大小写不敏感、不保留注释/空行/跨行值、插值易出错;需禁用optionxform、关闭interpolation、统一小写访问,并注意bom、换行符等非标准细节。

直接说结论:configparser 能读写标准 INI 文件,但默认不支持大小写敏感的 section 和 option,也不原生处理注释、空行或跨行值——这些得手动干预或换用第三方库。
为什么读出来的配置项全是小写?
configparser 默认把所有 section 名和 option 名转成小写,这是它的行为惯性,不是 bug。如果你的 INI 文件里写了 [Database] 或 Host = localhost,用 config.get("database", "host") 才能取到值,而不是 "Database" 或 "Host"。
- 解决办法:初始化时传入
interpolation=None并禁用大小写转换:config = configparser.ConfigParser(interpolation=None) config.optionxform = str # 保持 option 名原始大小写 # 注意:section 名仍需用原始大小写调用 get(),但内部存储仍是小写,所以更稳妥的是统一用小写访问
- 更安全的做法是:写配置时就约定全小写,读的时候也用小写,避免混淆
- 如果必须区分大小写(比如某些老系统要求
[LOG]和[log]不同),configparser就不适合,得用configobj或手写解析
写入配置后格式乱了,注释没了,空行被吞了
configparser 的 write() 方法只输出纯键值对,不保留原始文件的注释、缩进、空行或分号注释(; comment)。它本质上是个“键值序列化器”,不是“INI 编辑器”。
- 想保留格式?别用
config.write()直接覆盖原文件,改用config.read()加手动字符串拼接,或者用configparser.RawConfigParser配合正则预处理 - 写新配置推荐先用
config.add_section()和config.set()构建结构,再用config.write()输出干净的最小可用 INI - 如果原文件有
#注释(非标准,但常见),configparser默认不识别,需设comment_prefixes=('#', ';')(Python 3.2+)
读取带环境变量或引用的值时报错:InterpolationSyntaxError
默认启用的 BasicInterpolation 会尝试解析 %(host)s 这类占位符,但若值里含未闭合的 % 或非法引用,就会抛 configparser.InterpolationSyntaxError。
- 最简单解法:初始化时关掉插值:
config = configparser.ConfigParser(interpolation=None)
- 如果需要插值功能,确保所有
%都成对出现,且引用的 section/option 确实存在 - 注意:
RawConfigParser默认不插值,但它的get()返回原始字符串,不会帮你展开%(home)s
真正麻烦的从来不是读写本身,而是你拿到的 INI 文件是否“标准”——有没有混合注释风格、有没有 Unicode BOM、有没有 Windows 换行符、有没有 option 值里藏了等号。这些细节不提前检查,configparser 很容易静默失败或返回意外结果。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











