python读取ini和yaml配置文件应选对模块、注意编码与结构差异:ini用configparser(显式指定utf-8编码),yaml用pyyaml的safe_load();统一封装configloader类,按后缀自动解析,支持属性访问与fallback机制。

Python读取配置文件,ini 和 yaml 是两种最常用格式,选对模块、注意编码和结构差异,就能避免90%的解析问题。
读取 .ini 文件:用 configparser 标准库就够了
无需额外安装,Python 自带,适合简单键值+节(section)结构。
- 默认不支持注释和嵌套,但能处理
[section]下的key = value形式 - 推荐显式指定 encoding=’utf-8’,尤其 windows 下中文容易乱码
- 读取后是类字典对象,用
config['section']['key']或config.get('section', 'key')获取值 - 若需类型自动转换(如布尔、整数),可用
config.getboolean()、config.getint()等方法
读取 .yaml 文件:推荐 PyYAML,注意安全加载
需
pip install pyyaml</font>,支持复杂数据结构(列表、嵌套字典),但默认加载有风险。</p><div class="aritcle_card flexRow"> <div class="artcardd flexRow"> <a class="aritcle_card_img" href="/ai/2077" title="Tana"><img src="https://img.php.cn/upload/ai_manual/000/000/000/175680265491072.png" alt="Tana" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a> <div class="aritcle_card_info flexColumn"> <a href="/ai/2077" title="Tana">Tana</a> <p>“节点式”AI智能笔记工具,支持超级标签。</p> </div> <a href="/ai/2077" title="Tana" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a> </div> </div> <ul> <li>永远用 <code>yaml.safe_load()
,不用 yaml.load() —— 后者可能执行任意代码
true/false 或 yes/no(小写)name: "张三" 统一管理建议:封装一个 ConfigLoader 类
把不同格式的加载逻辑收拢,对外提供一致接口,方便后续扩展(比如加环境变量覆盖、热重载)。
立即学习“Python免费学习笔记(深入)”;
- 根据文件后缀自动选择解析器:
.ini → configparser,.yml/.yaml → PyYAML - 支持传入 base_dir 指定配置路径,避免硬编码绝对路径
- 可加入 fallback 机制:先读
config.yaml,缺失字段再从config.ini补充 - 返回对象可支持属性访问(如
cfg.db.host),用types.SimpleNamespace或第三方库如box
常见坑与绕过方式
实际项目中高频出错点,提前避雷。
- INI 中 key 含空格或特殊字符:configparser 默认只认字母数字和下划线,改用
configparser.ExtendedInterpolation()或换 YAML - YAML 时间/日期被转成 datetime 对象:PyYAML 默认解析
2023-01-01为datetime.date,如不需要,用自定义 Loader 禁用时间解析 - 配置项值为空字符串或 None:YAML 写
value:表示 NULL,INI 写value=表示空字符串,语义不同,读取后需做空值判断 - 多环境配置分离:推荐 YAML 的
---分段 + 自定义加载逻辑,或用config_dev.yaml/config_prod.yaml文件名区分