INI 文件是一种经典的配置文件格式,常用于存储程序的参数配置。以下是 INI 文件的结构说明及 Python 读写 INI 文件的完整方法,包含代码示例和注意事项。
INI 文件结构
基本规则
- 节(Section):用方括号
[section_name]
表示,用于逻辑分组配置项。 - 键值对(Key-Value):格式为
key = value
,等号两侧的空格可选。 - 注释:以
;
或#
开头,用于解释配置内容。 - 数据类型:值默认为字符串,需根据需求手动转换类型(如整数、布尔值等)。
示例文件 config.ini
; 数据库配置
[database]
host = localhost
port = 3306
username = admin
password = 123456
enabled = true ; 是否启用
[logging]
level = DEBUG
path = /var/log/app.log
Python 读取 INI 文件
使用内置库 configparser
(Python 3+ 中为 configparser
,Python 2 中为 ConfigParser
)。
1. 读取配置
import configparser
# 创建解析器对象
config = configparser.ConfigParser()
# 读取文件
config.read('config.ini')
# 获取所有节(section)
sections = config.sections() # 输出: ['database', 'logging']
# 获取某个节下的所有键
keys = config.options('database') # 输出: ['host', 'port', 'username', 'password', 'enabled']
# 获取键值(自动处理数据类型)
host = config.get('database', 'host') # 输出: 'localhost'
port = config.getint('database', 'port') # 输出: 3306
enabled = config.getboolean('database', 'enabled') # 输出: True
# 获取整个节的键值对(字典形式)
db_config = dict(config.items('database'))
# 输出: {'host': 'localhost', 'port': '3306', 'username': 'admin', ...}
2. 处理键不存在的情况
# 使用 fallback 提供默认值
timeout = config.getint('network', 'timeout', fallback=30) # 若键不存在,返回30
# 捕获异常
try:
value = config.get('nonexistent_section', 'key')
except (configparser.NoSectionError, configparser.NoOptionError) as e:
print(f"错误: {e}")
Python 写入 INI 文件
1. 修改或新增配置
import configparser
config = configparser.ConfigParser()
# 添加或修改节和键值对
config['database'] = {
'host': '192.168.1.100',
'port': '3306',
'timeout': '30', # 注意:值必须为字符串
'enabled': 'true'
}
# 添加新节
config.add_section('network')
config.set('network', 'retries', '3')
# 写入文件(覆盖原有内容)
with open('config.ini', 'w') as f:
config.write(f)
2. 保留原有结构(避免覆盖注释)
默认 configparser
会丢失注释和格式,若需保留原始结构,需手动处理或使用第三方库(如 configobj
)。
完整读写示例
import configparser
# 读取配置
config = configparser.ConfigParser()
config.read('config.ini')
# 修改数据库主机地址
config.set('database', 'host', '10.0.0.1')
# 新增超时参数
if not config.has_option('database', 'timeout'):
config.set('database', 'timeout', '60')
# 删除日志路径
if config.has_option('logging', 'path'):
config.remove_option('logging', 'path')
# 写入新文件
with open('new_config.ini', 'w') as f:
config.write(f)
注意事项
- 数据类型:写入时所有值必须为字符串,读取时使用
getint()
/getboolean()
转换。 - 大小写敏感:默认不敏感(键名会被转为小写),可通过
ConfigParser(allow_no_value=True, strict=False)
调整。 - 保留注释:
configparser
不支持保留注释,需使用其他库(如configobj
)处理。 - 文件路径:建议使用绝对路径,避免因工作目录不同导致文件找不到。
替代方案
- 复杂配置:使用 JSON/YAML(
json
或pyyaml
库)。 - 环境变量:使用
python-dotenv
读取.env
文件。
通过 configparser
,可以高效管理简单配置,适合轻量级应用场景。