告别硬编码!Python configparser 操作 .ini 配置文件全攻略

张开发
2026/4/21 9:06:58 15 分钟阅读

分享文章

告别硬编码!Python configparser 操作 .ini 配置文件全攻略
本章学习目标本章聚焦Python 项目配置管理帮助你彻底告别硬编码掌握企业级配置文件最佳实践。通过本章学习你将全面掌握Python3 configparser 读取、写入、修改、删除 .ini 配置文件的全套技能可直接用于 Flask/Django/ 爬虫 / 自动化脚本等真实项目。一、引言为什么配置文件如此重要在后端、爬虫、自动化脚本、数据分析等各类 Python 项目中配置管理是绕不开的核心环节。数据库地址、端口、账号密码、超时时间、日志路径、环境开关…… 这些信息如果写死在代码里会带来巨大隐患。1.1 背景与意义核心认知使用 .ini configparser 让项目从硬编码耦合进化为配置与代码分离这是现代工程化开发的基础标准。改配置不用改代码不用重新部署开发 / 测试 / 生产环境一键切换敏感信息密码、密钥不暴露在源码中多人协作更清晰降低维护成本轻量通用Windows/Linux/macOS 全平台兼容据行业实践统计90% 以上的 Python 中小型项目都优先使用 .ini 作为配置文件而 configparser 是 Python 官方内置标准库无需安装稳定兼容所有 Python3 版本。1.2 本章结构概览plaintext 概念解析 → 技术原理 → 基础API → 实战代码 → 项目封装 → 常见坑 → 总结展望二、核心概念解析2.1 基本定义概念一.ini 配置文件格式.ini 是经典的分段式键值对配置格式结构极简、易读易写。ini[section] key value key2 value2 [section2] key value[section]配置段用于分类key value键值对 或均可# / ;注释符号默认值类型字符串概念二configparser 模块Python 官方内置的.ini 配置文件解析库支持读取配置类型转换int/bool/float新增 / 修改 / 删除 section/option多文件合并读取容错与默认值2.2 关键术语解释⚠️ 必须掌握的基础术语section配置段相当于配置的分类目录option配置项即 section 下的 keyget()获取字符串值getint()/getboolean()获取数值、布尔值fallback键不存在时的默认值防报错2.3 技术架构概览 项目配置架构理解plaintext┌─────────────────────────────────────────┐ │ 配置文件层 (.ini) │ │ database / redis / app │ ├─────────────────────────────────────────┤ │ 解析工具层 (configparser) │ │ 读/写/改/删 / 类型转换 │ ├─────────────────────────────────────────┤ │ 业务调用层 │ │ Flask/Django/爬虫/脚本等 │ └─────────────────────────────────────────┘三、技术原理深入3.1 核心工作流程创建ConfigParser()对象调用.read(path, encodingutf-8)加载文件使用.get(section, option)获取配置写操作后必须.write(open())保存到文件支持类型自动转换、存在性检查、异常捕获3.2 标准配置文件示例全程通用新建config.iniini# # 数据库配置 # [database] host 127.0.0.1 port 3306 user root password 123456 db_name test_app charset utf8mb4 connect_timeout 10 # # Redis配置 # [redis] host 127.0.0.1 port 6379 password db 0 max_connections 100 # # 应用全局配置 # [app] env dev debug True version 2.1.0 max_workers 8 log_path ./logs/app.log allow_ips 192.168.1.1,192.168.1.2,127.0.0.1四、基础 API 精讲带超详细注释4.1 基础读取最常用python运行# 导入官方内置库无需pip安装 import configparser # 1. 创建配置解析器对象 conf configparser.ConfigParser() # 2. 读取ini文件指定utf-8避免中文乱码 conf.read(config.ini, encodingutf-8) # 3. 获取字符串类型配置 db_host conf.get(database, host) # 4. 获取int类型配置 db_port conf.getint(database, port) # 5. 获取布尔类型配置 debug conf.getboolean(app, debug) # 输出结果 print(数据库地址:, db_host) print(数据库端口:, db_port, type(db_port)) print(是否开启Debug:, debug, type(debug))4.2 获取所有 sections /options/itemspython运行import configparser conf configparser.ConfigParser() conf.read(config.ini, encodingutf-8) # 获取所有section sections conf.sections() print(所有配置段:, sections) # 判断section是否存在 has_redis conf.has_section(redis) print(是否存在redis段:, has_redis) # 获取某个section下所有key db_options conf.options(database) print(database下所有配置项:, db_options) # 获取某个section下所有键值对列表元组 db_items conf.items(database) print(database全部配置:, db_items) # 遍历输出 for key, value in conf.items(app): print(f{key} {value})4.3 判断 option 是否存在python运行# 判断某个key是否存在 has_pwd conf.has_option(database, password) print(是否存在password配置项:, has_pwd)4.4 带默认值读取防崩溃python运行# key不存在时返回fallback不报错 max_thread conf.get(app, max_thread, fallback8) print(最大线程数(默认值):, max_thread)五、写操作新增 / 修改 / 删除完整实战5.1 添加 section optionpython运行import configparser conf configparser.ConfigParser() conf.read(config.ini, encodingutf-8) # 新增section if not conf.has_section(http): conf.add_section(http) # 添加配置项 conf.set(http, timeout, 5) conf.set(http, retry, 3) conf.set(http, proxy, ) # 保存到文件必须执行才生效 with open(config.ini, w, encodingutf-8) as f: conf.write(f) print(✅ http配置添加完成)5.2 修改已有配置python运行# 修改app下的debug为False conf.set(app, debug, False) # 保存 with open(config.ini, w, encodingutf-8) as f: conf.write(f) print(✅ debug已关闭)5.3 删除某个配置项python运行# 删除app下的max_workers conf.remove_option(app, max_workers) # 保存 with open(config.ini, w, encodingutf-8) as f: conf.write(f)5.4 删除整个 sectionpython运行# 删除redis配置段 conf.remove_section(redis) # 保存 with open(config.ini, w, encodingutf-8) as f: conf.write(f)六、企业级实战封装可直接复制到项目6.1 配置工具类 ConfigUtil单例 注释拉满python运行# config_util.py import configparser import os class ConfigUtil: 配置文件工具类 功能读取ini配置单例模式支持str/int/bool/list # 单例实例 _instance None _conf None # 单例模式全局只加载一次配置 def __new__(cls, *args, **kwargs): if not cls._instance: cls._instance super().__new__(cls) # 初始化解析器 cls._conf configparser.ConfigParser() # 配置文件路径 config_path os.path.join(os.getcwd(), config.ini) # 读取文件 cls._conf.read(config_path, encodingutf-8) return cls._instance def get(self, section: str, option: str, fallbackNone) - str: 获取字符串配置 return self._conf.get(section, option, fallbackfallback) def get_int(self, section: str, option: str, fallback0) - int: 获取整数配置 return self._conf.getint(section, option, fallbackfallback) def get_bool(self, section: str, option: str, fallbackFalse) - bool: 获取布尔配置 return self._conf.getboolean(section, option, fallbackfallback) def get_list(self, section: str, option: str, sep,) - list: 扩展获取逗号分隔的列表 示例allow_ips 1.1.1.1,2.2.2.2 value self.get(section, option) return [i.strip() for i in value.split(sep)] if value else []6.2 使用工具类python运行from config_util import ConfigUtil # 全局唯一配置对象 config ConfigUtil() # 读取数据库信息 db_host config.get(database, host) db_port config.get_int(database, port) debug config.get_bool(app, debug) ips config.get_list(app, allow_ips) print(db_host:, db_host) print(db_port:, db_port) print(debug:, debug) print(允许IP列表:, ips)七、真实业务案例数据库连接工具python运行# db.py import pymysql from config_util import ConfigUtil # 加载配置 config ConfigUtil() class DB: 数据库工具类基于配置文件连接 staticmethod def get_conn(): 获取MySQL连接 return pymysql.connect( hostconfig.get(database, host), portconfig.get_int(database, port), userconfig.get(database, user), passwordconfig.get(database, password), databaseconfig.get(database, db_name), charsetconfig.get(database, charset), connect_timeoutconfig.get_int(database, connect_timeout) ) staticmethod def query(sql: str): 执行查询 conn DB.get_conn() cursor conn.cursor() cursor.execute(sql) res cursor.fetchall() cursor.close() conn.close() return res # 测试 if __name__ __main__: version DB.query(SELECT VERSION()) print(数据库版本:, version)八、高级用法生产环境必备8.1 读取多个配置文件合并覆盖python运行conf configparser.ConfigParser() # 先读基础配置再读环境配置后面覆盖前面 conf.read([base.ini, dev.ini, local.ini], encodingutf-8)8.2 错误安全调用python运行def safe_get(conf, section, option, default): try: return conf.get(section, option) except (configparser.NoSectionError, configparser.NoOptionError): return default8.3 保留注释扩展方案原生 configparser 保存会丢失注释生产环境可使用bash运行pip install configparser_pluspython运行from configparser_plus import ConfigParser九、常见问题与解决方案FAQQ1读取中文乱码怎么办Aread 时指定encodingutf-8。Q2getboolean () 支持哪些值Atrue/false、yes/no、on/off、1/0。Q3配置项不存在会崩溃吗A会抛异常必须用fallback或try-except。Q4为什么修改后不生效A必须执行write()写入文件才会保存。Q5可以用 # 和写注释吗A可以原生支持。十、最佳实践总结配置与代码彻底分离密码绝不写在代码里使用单例工具类全局统一读取必须加 fallback 默认值防止启动崩溃分段清晰database、redis、app、log、http 等生产环境关闭 debug通过配置控制多环境分离dev.ini / test.ini / prod.ini十一、本章小结✅ 本章你已掌握.ini 配置文件标准格式configparser 全套读取 / 写入 / 修改 / 删除int/bool/list 类型转换企业级单例配置工具类封装真实项目数据库配置案例生产环境最佳实践与避坑从今天起彻底告别硬编码让你的 Python 项目更规范、更安全、更易维护

更多文章