会。python原生configparser读写ini时丢失注释、空行和缩进,因只解析键值对;rawconfigparser也无法保留注释;推荐使用configobj库,它专为保留格式设计,支持注释、空行、内联注释等。

Python原生configparser读INI会丢注释吗?
会。标准configparser.ConfigParser在read()后再write(),所有注释、空行、原始缩进全部消失——它只解析键值对,不保留文件结构。这不是bug,是设计使然。
用configparser.RawConfigParser + 自定义写入能保注释吗?
不能直接保。即使改用RawConfigParser(避免%变量展开),write()方法仍只输出标准格式。真正可行的方案是:**不依赖write(),改用手动拼接+原文件解析还原**。
- 先用
configparser.ConfigParser读取结构(section/key/value) - 再用
open()逐行读原文件,用正则或状态机识别注释、空行、section头、key行 - 修改时只替换对应key的值部分,其余行原样保留
- 写回时按原顺序输出所有行(含注释)
有没有轻量级第三方库能直接保注释?
有,configobj是目前最成熟的选择。它专为保留格式而设计,支持注释、空行、内嵌注释、续行,且API与configparser高度兼容。
安装:pip install configobj
华为云 Python SDK 查询工具。自动发现已安装 SDK 的服务包、Client类、API 方法、入参详情、类信息(__init__ 参数、属性、类型、描述),支持关键字搜索,快速定位目标 API 使用方法。
基本用法:
from configobj import ConfigObj<br>config = ConfigObj('app.ini')<br>config['database']['host'] = '10.0.1.5'<br>config.write() # 注释和格式全保留
注意:configobj默认不严格校验INI语法(比如允许无引号的value含空格),若需强校验,得配合validate模块;另外它不支持interpolation(如%(...)s),这点和configparser不同。
自己手写解析器要注意哪些坑?
手动维护注释的关键陷阱不在逻辑,而在边界情况:
-
;和#都算注释符,但#在Windows下可能被误认为无效(某些老工具只认;) - 注释可能紧跟在key后:
port = 8080 # 推荐端口,这种内联注释必须整体保留整行 - section名支持空格和特殊字符:
[my section]合法,但configparser默认会strip掉方括号外空格,手动解析得原样存 - 写回时换行符要和原文件一致(
\nvs\r\n),否则Git diff会炸
真要自己造轮子,建议优先复用configobj,除非项目禁用第三方依赖或需要极简体积——那种情况下,别碰内联注释,只处理行首注释+空行,复杂度能降一大半。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










