Python 配置文件解析利器:configparser 使用指南
目录
一、快速安装
二、模块简介
三、INI文件格式
四、基础用法
1 创建配置文件
2 读取配置文件
3 访问配置项
4 常用方法
五、高级功能
1 数据类型处理
2 默认值与回退
3 插值功能
4 自定义解析器
六、错误处理
七、最佳实践
八、完整示例
九、 注意事项
十、总结
🚀 个人主页:xmp65535
🚀 专栏:python技术专栏
configparser
是 Python 标准库中用于处理 INI 格式配置文件 的模块。它可以帮助你轻松读取、修改和生成配置文件,适用于保存程序设置、数据库连接信息等场景。
一、快速安装
configparser
是 Python 内置模块,无需额外安装,直接导入即可:
import configparser
二、模块简介
configparser
是Python标准库中用于处理INI格式配置文件的模块,支持:
-
多级配置节(Section)
-
类型自动转换
-
插值表达式
-
注释处理
-
配置项验证
import configparser
print(configparser.__version__) # 输出模块版本
三、INI文件格式
典型结构示例:
[DEFAULT]
server_ip = 127.0.0.1
port = 8080
[database]
; MySQL配置
host = localhost
user = admin
password = secret
timeout = 5.5
ssl_enabled = true
[logging]
level = INFO
handlers = console, file
四、基础用法
1 创建配置文件
config = configparser.ConfigParser()
# 创建DEFAULT节(特殊节)
config['DEFAULT'] = {
'debug': 'False',
'max_retries': '3'
}
# 添加新节
config['database'] = {
'host': 'localhost',
'port': '3306'
}
# 单独添加配置项
config['webapp'] = {}
config['webapp']['thread_pool'] = '10'
# 写入文件
with open('app_config.ini', 'w') as f:
config.write(f)
生成文件内容:
[DEFAULT]
debug = False
max_retries = 3
[database]
host = localhost
port = 3306
[webapp]
thread_pool = 10
2 读取配置文件
config = configparser.ConfigParser()
# 读取单个文件
config.read('app_config.ini')
# 读取多个文件
found_files = config.read(['app_config.ini', 'override.ini'])
print("成功加载的文件:", found_files)
# 安全加载(文件不存在不报错)
try:
config.read('nonexistent.ini', encoding='utf-8')
except FileNotFoundError:
print("文件不存在")
3 访问配置项
# 检查节是否存在
print('database' in config) # True
# 获取所有节(排除DEFAULT)
sections = config.sections()
print(sections) # ['database', 'webapp']
# 获取配置项
print(config['database']['host']) # localhost
# 安全获取(带默认值)
timeout = config.get('database', 'timeout', fallback='10')
print(timeout) # 使用DEFAULT节的timeout或返回10
# 获取所有键值对
for key in config['database']:
print(f"{key} = {config['database'][key]}")
4 常用方法
方法 | 作用 | 示例 |
---|---|---|
sections() | 获取所有 Section 名称 | config.sections() |
options(section) | 获取某个 Section 的所有键名 | config.options('DATABASE') |
get(section, key) | 获取字符串类型的值 | config.get('DATABASE', 'host') |
getint(section, key) | 获取整型值(自动转换) | config.getint('DATABASE', 'port') |
getfloat(section, key) | 获取浮点型值 | config.getfloat(...) |
getboolean(section, key) | 获取布尔值(支持 yes/no , true/false ) | config.getboolean(...) |
add_section(section) | 添加新 Section | config.add_section('NEW_SECTION') |
remove_section(section) | 删除 Section | config.remove_section(...) |
set(section, key, value) | 修改或新增键值对 | config.set('DATABASE', 'host', '192.168.1.1') |
五、高级功能
1 数据类型处理
# 自动类型转换
config['DEFAULT']['max_retries'] = '3'
config['DEFAULT']['ratio'] = '0.85'
config['DEFAULT']['ssl_enabled'] = 'true'
print(config.getint('DEFAULT', 'max_retries')) # 3
print(config.getfloat('DEFAULT', 'ratio')) # 0.85
print(config.getboolean('DEFAULT', 'ssl_enabled')) # True
# 自定义转换器
def parse_size(value):
units = {"KB": 1024, "MB": 1024**2, "GB": 1024**3}
number, unit = value.split()
return int(float(number) * units[unit])
config['storage'] = {'max_size': '2.5 GB'}
size = parse_size(config['storage']['max_size'])
print(size) # 2684354560
2 默认值与回退
# 全局默认值
config = configparser.ConfigParser(defaults={
'loglevel': 'WARNING',
'retries': '3'
})
# 节内默认值
config['DEFAULT']['timeout'] = '30'
# 多层回退
value = config.get('api', 'timeout',
fallback=config['DEFAULT']['timeout'])
3 插值功能
config = configparser.ConfigParser(interpolation=configparser.ExtendedInterpolation())
config['DEFAULT'] = {
'home_dir': '/var/app',
'data_dir': '%(home_dir)s/data'
}
config['paths'] = {
'log_dir': '${home_dir}/logs',
'temp_dir': '${paths:log_dir}/temp'
}
print(config['paths']['temp_dir']) # /var/app/logs/temp
4 自定义解析器
class MyConfigParser(configparser.ConfigParser):
def optionxform(self, optionstr):
"""保持键的大小写敏感"""
return optionstr
def _validate(self, section, option, value):
"""自定义验证逻辑"""
if option == 'port' and not (0 < int(value) <= 65535):
raise ValueError("Invalid port number")
super()._validate(section, option, value)
custom_parser = MyConfigParser()
六、错误处理
try:
print(config['nonexistent_section']['option'])
except configparser.NoSectionError:
print("配置节不存在!")
try:
value = config.get('database', 'invalid_option')
except configparser.NoOptionError:
print("配置项不存在!")
# 安全访问方法
value = config.get('database', 'invalid_option', fallback='default_value')
七、最佳实践
-
配置组织规范:
# ini文件 [production] ; 继承DEFAULT并覆盖 database.host = db.prod.example.com [staging:production] ; 继承production配置 database.host = db.stage.example.com
-
敏感信息处理:
# 从环境变量读取密码 import os config['database']['password'] = os.getenv('DB_PASSWORD')
-
配置版本控制:
# ini [metadata] config_version = 1.2
八、完整示例
import configparser
# 初始化配置
config = configparser.ConfigParser(interpolation=configparser.ExtendedInterpolation())
# 创建默认配置
defaults = {
'threads': '4',
'log_level': 'INFO'
}
config.read_dict({'DEFAULT': defaults})
# 读取多个配置文件
config.read(['base_config.ini', 'override.ini'])
# 访问配置
try:
db_config = {
'host': config['database']['host'],
'port': config.getint('database', 'port'),
'user': config['database']['user'],
'password': config['database']['password']
}
except configparser.Error as e:
print(f"配置错误: {e}")
exit(1)
# 动态更新配置
if config.getboolean('debug', 'enabled'):
config['DEFAULT']['log_level'] = 'DEBUG'
# 保存用户自定义配置
user_config = configparser.ConfigParser()
user_config['user_prefs'] = {
'theme': 'dark',
'notifications': 'yes'
}
with open('user.ini', 'w') as f:
user_config.write(f)
九、 注意事项
-
文件路径问题:
确保配置文件路径正确(建议使用绝对路径或检查当前工作目录)。 -
键值不存在时的处理:
使用get()
方法时,如果键不存在会抛出NoOptionError
。可以通过以下方式避免:# 提供默认值 timeout = config.get('DATABASE', 'timeout', fallback=30)
-
大小写敏感:
默认情况下键名是 不区分大小写 的(全部转为小写)。如需保留大小写,初始化时设置:config = configparser.ConfigParser(allow_no_value=True, strict=True)
-
注释和空行:
INI 文件支持以#
或;
开头的注释,空行会被自动忽略。
十、总结
-
适用场景:中小型项目的配置管理,需要人类可读的简单配置文件。
-
替代方案:复杂场景可考虑 JSON/YAML 格式(使用
json
或pyyaml
模块)。 -
优势:简单易用,无需第三方依赖,兼容 INI 标准格式。
通过 configparser
,你可以轻松实现配置与代码分离,让程序更灵活、更易维护!