Python 极简配置方案:只使用 INI 文件完成项目全部配置

Python 极简配置方案:只使用 INI 文件完成项目全部配置
一、前言在 Python 开发中很多人会纠结 YAML、JSON、TOML、py 配置文件该怎么选。但如果你只是写中小型脚本、后台工具、自动化程序、轻量接口服务INI 文件完全可以包揽全部配置需求无需安装任何第三方库Python 标准库自带configparser开箱即用、上手零门槛运维人员不用懂代码就能修改参数。INI 文件结构清晰、分段分组、支持注释、读写简单没有复杂缩进、特殊语法坑本文完整讲解纯 INI 配置实战覆盖读取、写入、类型转换、多配置文件分离、配置持久化保存等全套代码全程不引入任何第三方依赖。二、INI 文件基础语法说明INI 文件核心由「分段」「键值对」「注释」三部分组成[section]分段区域用来分类配置比如数据库、日志、接口、服务key value配置项等号两侧空格无强制要求#开头为注释用于备注参数作用原生所有读取值默认字符串数字、布尔、列表需要手动转换。示例config.ini# 服务基础配置 [server] debug True port 8080 timeout 30 service_name 自动化采集工具 # 数据库连接配置 [mysql] host 127.0.0.1 user root password root123456 db_name test_db pool_size 10 # 文件输出配置 [output] save_path ./data file_prefix task_data三、基础读取 INI 配置完整代码Python 内置configparser模块无需 pip 安装直接导入使用importconfigparser# 初始化解析器cfgconfigparser.ConfigParser()# 读取ini文件指定编码防止中文乱码cfg.read(config.ini,encodingutf-8)# 1. 读取字符串类型配置service_namecfg.get(server,service_name)save_pathcfg.get(output,save_path)print(服务名称,service_name)print(文件保存路径,save_path)# 2. 读取数字int/floatportcfg.getint(server,port)timeoutcfg.getint(server,timeout)pool_sizecfg.getint(mysql,pool_size)print(服务端口,port,type(port))# 3. 读取布尔值debugcfg.getboolean(server,debug)print(调试模式,debug,type(debug))# 4. 获取所有分段名称sectionscfg.sections()print(所有配置分组,sections)# 5. 获取某一分组下全部键值对mysql_configdict(cfg.items(mysql))print(数据库完整配置,mysql_config)读取结果说明get()统一返回字符串适合路径、账号、文本getint()自动转整型端口、超时、连接池数量专用getfloat()浮点数值如超时秒数、比例系数getboolean()自动识别true/false/1/0/yes/no转为布尔值。四、修改、新增配置并写入保存到 INI业务运行中需要动态更新配置、新增参数、生成新配置文件configparser支持直接修改内存配置后落地写入文件importconfigparser cfgconfigparser.ConfigParser()cfg.read(config.ini,encodingutf-8)# 1. 修改已有配置项cfg.set(server,port,8090)cfg.set(server,debug,False)# 2. 新增配置分组与参数ifnotcfg.has_section(redis):cfg.add_section(redis)cfg.set(redis,host,127.0.0.1)cfg.set(redis,port,6379)cfg.set(redis,password,)# 3. 删除配置项/分组# cfg.remove_option(server, timeout)# cfg.remove_section(redis)# 4. 写入回文件withopen(config.ini,w,encodingutf-8)asf:cfg.write(f)print(配置修改完成已保存至 config.ini)五、INI 实现列表/数组配置INI原生不支持列表通用方案INI 标准没有数组语法工程通用解决方案用英文逗号分隔字符串读取后分割转列表适配白名单、多文件路径、多数据源场景。1. ini 配置增加列表参数[filter] white_list admin,test,robot,guest target_suffix txt,json,csv2. 读取并转为列表importconfigparser cfgconfigparser.ConfigParser()cfg.read(config.ini,encodingutf-8)# 读取逗号分隔字符串并分割white_list_strcfg.get(filter,white_list)white_list[item.strip()foriteminwhite_list_str.split(,)]suffix_strcfg.get(filter,target_suffix)suffix_list[s.strip()forsinsuffix_str.split(,)]print(白名单列表,white_list)print(文件后缀列表,suffix_list)六、多环境配置分离仅用INI实现开发/生产环境很多项目需要区分开发、测试、生产环境不用引入多套配置文件单 INI 文件多分段实现[dev_server] debug True port 8080 mysql_host 127.0.0.1 [prod_server] debug False port 80 mysql_host 10.0.0.10读取时指定环境变量切换分组importconfigparserimportos# 可通过环境变量切换环境默认开发环境envos.getenv(RUN_ENV,dev)cfgconfigparser.ConfigParser()cfg.read(config.ini,encodingutf-8)# 拼接环境分组前缀sectionf{env}_serverdebugcfg.getboolean(section,debug)portcfg.getint(section,port)mysql_hostcfg.get(section,mysql_host)print(f当前环境{env})print(f调试开关{debug}端口{port})七、封装全局配置工具类项目实战标准写法把 INI 读写逻辑封装成工具类项目全局调用统一管理配置避免重复写读取代码importconfigparserimportosclassIniConfig:def__init__(self,file_pathconfig.ini):self.file_pathfile_path self.cfgconfigparser.ConfigParser()# 文件不存在则自动创建空iniifos.path.exists(self.file_path):self.cfg.read(self.file_path,encodingutf-8)else:self.save()defget_str(self,section,key,default):ifself.cfg.has_option(section,key):returnself.cfg.get(section,key)returndefaultdefget_int(self,section,key,default0):valself.get_str(section,key)try:returnint(val)except:returndefaultdefget_bool(self,section,key,defaultFalse):ifself.cfg.has_option(section,key):returnself.cfg.getboolean(section,key)returndefaultdefget_list(self,section,key,defaultNone):ifdefaultisNone:default[]valself.get_str(section,key)ifnotval:returndefaultreturn[i.strip()foriinval.split(,)]defset(self,section,key,value):ifnotself.cfg.has_section(section):self.cfg.add_section(section)self.cfg.set(section,key,str(value))self.save()defsave(self):withopen(self.file_path,w,encodingutf-8)asf:self.cfg.write(f)# 全局单例配置configIniConfig()# 使用示例if__name____main__:# 读取portconfig.get_int(server,port,8080)white_listconfig.get_list(filter,white_list)print(端口,port,白名单,white_list)# 修改写入config.set(server,timeout,60)八、只使用 INI 做配置的优势零第三方依赖Python 标准库内置configparser不需要安装 PyYAML、tomli、json 额外工具打包、部署、轻量化脚本无额外依赖冲突。上手门槛极低运维友好格式简单无缩进、括号、逗号语法坑非开发人员也能快速修改配置注释清晰直观。天然分组隔离[section]分段天然区分数据库、日志、接口、文件配置逻辑分层一目了然。读写稳定兼容所有系统Windows、Linux、Mac 全部完美支持不存在 JSON 不能写注释、YAML 缩进报错的问题。支持动态持久化程序运行时可新增、修改、删除配置并保存到本地适合工具类程序动态保存参数。九、INI 文件局限性与适配方案INI 不是万能格式有原生短板全部可以通过简单代码弥补无需更换配置文件不支持多层嵌套解决方案分层命名 key如mysql_write_host、mysql_read_port或拆分多 section无原生数组解决方案逗号分割字符串读取转列表上文已提供通用封装所有值默认字符串解决方案封装getint/getbool/getlist工具方法统一转换复杂结构化数据存储麻烦解决方案复杂字典数据单独用 json 临时存储业务配置仍统一使用 INI。十、适用场景总结只推荐 INI 的场景自动化脚本、爬虫工具、本地小工具轻量 Flask/FastAPI 小型后台服务运维辅助程序、定时任务程序不想管理第三方依赖、追求极简部署的项目需要运维人员频繁手动修改配置的线上工具。十一、结尾很多开发者盲目跟风使用 YAML、TOML 做配置忽略了 INI 轻量化、零依赖的优势。对于绝大多数中小型 Python 程序仅靠 INI 文件就能完整承载所有业务配置搭配简单封装类即可补齐列表、类型转换、动态修改等短板大幅降低项目依赖与维护成本。

最新新闻

日新闻

周新闻

月新闻