configparser.ConfigParser()
是 Python 中用于处理 INI 格式配置文件 的模块,适合管理程序的配置参数。以下是它的核心用法:
1. 配置文件格式(INI 文件示例)
假设配置文件 config.ini
内容如下:
[database]
host = localhost
port = 3306
user = root
password = secret
debug_mode = true
[paths]
data_dir = /var/data
log_file = app.log
2. 基本使用步骤
2.1 读取配置文件
import configparser
# 创建 ConfigParser 对象
config = configparser.ConfigParser()
# 读取文件(需确保文件存在)
config.read('config.ini')
# 读取所有节(section)名称
sections = config.sections() # 输出: ['database', 'paths']
2.2 获取配置值
# 获取某个节下的键值
host = config.get('database', 'host') # 'localhost'
port = config.getint('database', 'port') # 3306(自动转为整数)
debug = config.getboolean('database', 'debug_mode') # True(转为布尔值)
# 类似字典的方式访问
data_dir = config['paths']['data_dir'] # '/var/data'
2.3 修改或添加配置
# 修改现有值
config.set('database', 'host', '192.168.1.100')
# 添加新节和键值
config.add_section('network')
config.set('network', 'timeout', '30')
# 保存更改到文件(覆盖原文件)
with open('config.ini', 'w') as f:
config.write(f)
2.4 默认值与错误处理
# 安全获取值(键不存在时返回默认值)
max_retries = config.getint('database', 'max_retries', fallback=3)
# 捕获异常
try:
user = config.get('database', 'user')
except (configparser.NoSectionError, configparser.NoOptionError) as e:
print(f"配置错误: {e}")
3. 高级功能
3.1 类型转换方法
方法 | 说明 |
---|---|
get(section, key) | 返回字符串 |
getint(section, key) | 返回整数 |
getfloat(section, key) | 返回浮点数 |
getboolean(section, key) | 返回布尔值(支持 true/false , yes/no ) |
3.2 检查配置是否存在
# 检查节是否存在
if 'database' in config:
print("存在 database 节")
# 检查键是否存在
if 'host' in config['database']:
print("存在 host 键")
3.3 合并多个配置文件
config.read(['config.ini', 'override.ini']) # 后者优先级更高
4. 完整示例
import configparser
# 创建并读取配置
config = configparser.ConfigParser()
config.read('config.ini')
# 读取数据库配置
db_host = config.get('database', 'host')
db_port = config.getint('database', 'port')
# 修改日志路径
config.set('paths', 'log_file', '/tmp/new_app.log')
# 添加新配置
if not config.has_section('debug'):
config.add_section('debug')
config.set('debug', 'verbose', 'false')
# 保存配置
with open('config.ini', 'w') as f:
config.write(f)
5. 注意事项
- 文件编码:默认使用系统编码,若文件含中文,可指定编码:
config.read('config.ini', encoding='utf-8')
- 键大小写敏感:默认键名不区分大小写(
HOST
和host
视为相同)。
若需区分大小写,创建时设置:config = configparser.ConfigParser(allow_no_value=True, strict=True)
- 保留原始格式:写入文件时,注释和空行会被清除。若需保留,需手动处理。
通过 configparser
,可以轻松实现配置文件的读写和管理,非常适合需要灵活配置的应用场景。
以下是 configparser.ConfigParser()
的常用方法及使用场景,帮助你高效管理 INI 格式配置文件:
1. 核心方法分类
类别 | 方法 | 作用 | 示例 |
---|---|---|---|
读取配置 | read() | 读取配置文件 | config.read('config.ini') |
get() | 获取字符串值 | config.get('section', 'key') | |
getint() | 获取整数值 | config.getint('db', 'port') | |
getfloat() | 获取浮点数值 | config.getfloat('metrics', 'ratio') | |
getboolean() | 获取布尔值 | config.getboolean('debug', 'enable') | |
写入配置 | add_section() | 添加新节(section) | config.add_section('network') |
set() | 设置或修改键值 | config.set('db', 'host', '10.0.0.1') | |
write() | 将配置写入文件 | with open('file', 'w') as f: config.write(f) | |
检查存在性 | has_section() | 检查节是否存在 | config.has_section('database') |
has_option() | 检查键是否存在 | config.has_option('paths', 'log') | |
遍历配置 | sections() | 返回所有节的列表 | config.sections() → ['db', 'paths'] |
options() | 返回某节下所有键的列表 | config.options('db') → ['host', 'port'] | |
items() | 返回某节下所有键值对的列表 | config.items('db') → [('host', 'localhost'), ...] | |
默认值与容错 | get(..., fallback=...) | 键不存在时返回默认值 | config.get('db', 'timeout', fallback=5) |
删除配置 | remove_section() | 删除整个节 | config.remove_section('old_section') |
remove_option() | 删除某节下的键 | config.remove_option('db', 'password') |
2. 关键方法详解
2.1 读取配置
import configparser
config = configparser.ConfigParser()
config.read('config.ini') # 可接受列表读取多个文件,如 ['base.ini', 'override.ini']
# 获取值(自动处理类型)
host = config.get('database', 'host')
port = config.getint('database', 'port')
debug = config.getboolean('debug', 'enable', fallback=False) # 默认值
2.2 修改与保存配置
# 添加新节和键值
if not config.has_section('network'):
config.add_section('network')
config.set('network', 'timeout', '30')
# 删除配置
config.remove_option('database', 'password')
# 保存到文件(覆盖模式)
with open('new_config.ini', 'w') as f:
config.write(f)
2.3 遍历所有配置
# 遍历所有节
for section in config.sections():
print(f"[{section}]")
# 遍历节下所有键值对
for key, value in config.items(section):
print(f"{key} = {value}")
2.4 错误处理
try:
user = config.get('database', 'user')
except configparser.NoSectionError:
print("节不存在!")
except configparser.NoOptionError:
print("键不存在!")
3. 高级用法
3.1 默认值配置
# 创建带默认值的 ConfigParser
config = configparser.ConfigParser(defaults={'timeout': '10', 'retries': '3'})
# 读取时优先使用配置文件中的值,缺失时用默认值
timeout = config.getint('network', 'timeout') # 若配置中无 timeout,返回 10
3.2 保留原始格式(注释和空格)
默认情况下,configparser
会丢弃注释和空格。如需保留,需自定义解析器:
class CustomConfigParser(configparser.ConfigParser):
def __init__(self):
super().__init__(allow_no_value=True)
def optionxform(self, optionstr):
return optionstr # 保持键的大小写敏感
config = CustomConfigParser()
config.read('config.ini')
3.3 合并配置
config.read(['base.ini', 'override.ini']) # 后者的配置覆盖前者
4. 示例配置文件
config.ini
:
[database]
host = localhost # 数据库地址
port = 3306
user = admin
password = 123456
[debug]
enable = yes
5. 注意事项
- 键大小写:默认不区分大小写(
Host
和HOST
视为相同)。
若需区分,初始化时设置configparser.ConfigParser(strict=True)
。 - 文件编码:读取时指定编码(如
encoding='utf-8'
),避免中文乱码。 - 布尔值识别:
getboolean()
支持true/false
,yes/no
,on/off
,1/0
。
掌握这些方法后,可以轻松实现配置文件的动态管理和复杂场景的适配!