本文要点
拿到文件后,第一步是确认节在不在,第二步是确认键在不在
确认节和键都在之后,取值用 get(section, option)
缺项分两种情况,处理方式不同

本文目录
先回答:节名、键名和值分别从哪来
如果你有一个自己写的INI文件,想读出里面的配置,ConfigParser把文件内容分成三层:节(section)、键(option)、值(value)。节是方括号包起来的那一行,键是节里等号左边的名字,值是等号右边的内容。
读之前先明确一件事:ConfigParser读的是文本,值默认以字符串形式返回。也就是说,即使INI里写的是 port = 8080,读出来也是字符串 "8080",不是整数 8080。这个默认行为决定了后面要不要用 getint。
本文只处理你自己写的、不含密钥的练习配置。下面所有节名、键名和值都是自建示例,不是真实配置。动手前建议在练习目录里新建一个文件,例如 exercise/demo.ini,不要拿正在用的配置文件直接试。
一个自建样例,内容如下:
[server]
host = 127.0.0.1
port = 8080
[limits]
retries = 3
这个文件里有两个节:server 和 limits。server 节里有两个键:host 和 port。limits 节里有一个键:retries。
读节和读键:sections、has_section与has_option
拿到文件后,第一步是确认节在不在,第二步是确认键在不在。这两步分开做,不要跳过。
按 configparser 文档,sections() 返回所有可用节的列表,但不包括 DEFAULT。has_section(section) 判断某个节是否存在。has_option(section, option) 判断某个节里某个键是否存在。
自建示例的读取顺序可以这样安排:
1. 先调用 sections(),看返回的列表里有没有 server 和 limits。
2. 再用 has_section("server") 确认 server 节存在。
3. 再用 has_option("server", "port") 确认 port 键存在。
这样做的原因是:直接读一个不存在的节或键会抛异常。先判断再取值,能把“节不存在”和“键不存在”分开定位,而不是笼统报一个错。
一个容易忽略的点:has_option 的第一个参数是节名,第二个是键名,两个都要给。只给键名判断不了它在哪个节里。
值默认是字符串:get返回什么,getint怎么转
确认节和键都在之后,取值用 get(section, option)。按文档说明,get 返回的是字符串。
用自建样例对照:
get("server", "host") 返回 "127.0.0.1",这本来就是字符串,看不出差别。
get("server", "port") 返回 "8080",注意它是字符串,不是整数。
get("limits", "retries") 返回 "3",同样是字符串。
如果你要把 port 当数字用,就要用 getint(section, option)。getint 会把这个字符串转成整数,返回 8080。
这里要分清两件事:get 不做类型转换,getint 做整数转换。文档里还有 getfloat 和 getboolean,分别对应浮点和布尔转换,本文只讲 getint 这一条。
为什么值默认是字符串:INI 文件本身是纯文本,等号右边写什么就是什么,解析器不会替你猜它是数字还是文字。所以“值默认字符串”不是缺陷,是文本格式的必然结果。你需要在读取时自己决定要不要转换。
缺项怎么处理:get的fallback与getint的转换失败
缺项分两种情况,处理方式不同。
第一种,键不存在但你不想让它报错。文档给出的做法是:在节级 get 里,把 fallback 作为第二个位置参数传进去,写成 topsecret.get('Cipher', '3des-cbc'),当键不存在时返回这个值,而不是抛异常。
自建示例:get("server", "timeout", "30")。因为 server 节里没有 timeout 键,这行返回 "30"。注意 fallback 给的是字符串 "30",不是整数 30,因为 get 本身不做类型转换。
文档还提示一点:默认值优先于 fallback。如果某个键只在 DEFAULT 节里定义过,那么即使你传了 fallback,取到的仍然是 DEFAULT 里的值。
第二种,键存在但值转不成整数。这时用 getint 会失败。文档说明 getint 在值不是整数时会抛异常。这不是缺项,是值格式不对,排查方向也不同:缺项要看键名拼写和节名,转换失败要看等号右边写的内容。
把这两种情况分开记:键不存在,用 fallback 兜底;键存在但值不是数字,getint 会报错,需要回到文件里改值,而不是加 fallback。
动手前要留意的边界
第一,本文只处理你自己写的、不含密钥的练习配置。文档专门警告:解析来自不可信来源的数据时要谨慎,恶意 INI 文件可能让解码器消耗大量 CPU 和内存资源,建议限制待解析数据的大小。
第二,键名默认会被转成小写。文档说明 optionxform() 默认把名称转成小写,写回文件时所有键也是小写。如果你需要保留原始大小写,要覆盖这个方法,但那是另一件事,本文不展开。
第三,DEFAULT 节不能被删除。文档指出,尝试删除 DEFAULT 会抛 ValueError,parser.clear() 也会保留它。所以不要把它当成一个普通节能清掉。
第四,本文没有涉及插值、注释前缀、自定义转换器这些内容。如果你手上的配置文件用了 %(name)s 这类写法,取值结果会和本文示例不同,需要另查插值相关说明。
观看知识要点视频 18 秒
18秒无旁白要点导览,文字来自已审核正文;完整步骤、条件及参考资料见下方。
参考资料
以下原始资料提供本文依据;请结合日期、适用条件和产品说明查阅。
请结合原始资料的适用条件阅读。
返回效率工具 →