本文要点
getint 和 getfloat 的用法和 get 一样,只是返回值类型不同
这是三个转换方法里最需要单独讲的一个
getboolean 会按一套固定的对应关系把字符串转成布尔值

本文目录
读出来的值一律是字符串,转换要自己做
如果你用 configparser 读一个自己写的 INI 文件,拿到 port = 8080 这样的值,它返回的是字符串 "8080",不是整数 8080。
这不是读错了。按 configparser 文档的说明,配置解析器不猜测配置文件里值的类型,一律在内部按字符串存储。所以需要整数、浮点数或布尔值时,转换这一步要自己做。文档同时说明,因为这件事太常见,解析器提供了一组现成的 getter 方法来处理整数、浮点和布尔值。
本文只讲 getint、getfloat、getboolean 这三个转换方法怎么用,以及布尔值为什么不能直接交给 bool()。不涉及其他类型转换库,也不讲文件读写步骤。下面所有节名、键名和值都是自建的练习数据。动手前建议在练习目录里新建一个文件,例如 exercise/demo.ini,不要拿正在用的配置文件直接试。
一个自建样例,内容如下:
[server]
port = 8080
ratio = 0.75
forward = no这个文件里有一个节 server,三个键:port、ratio、forward。它们读出来都是字符串。
getint 与 getfloat:把数字字符串转成数值
getint 和 getfloat 的用法和 get 一样,只是返回值类型不同。
对上面那个自建样例,读 port 和 ratio 可以这样写:
import configparser
config = configparser.ConfigParser()
config.read("exercise/demo.ini")
port = config.getint("server", "port")
ratio = config.getfloat("server", "ratio")
print(port + 1)
print(ratio * 2)port 拿到的是整数 8080,可以直接参与加法;ratio 拿到的是浮点数 0.75,可以直接参与乘法。如果改用 config.get("server", "port"),拿到的是字符串 "8080",拿它做加法会报错。
这里要分清一件事:getint 和 getfloat 不是“读的时候顺便转”,而是读出来之后再转换。文档给出的等价写法是先取字符串再自己转,例如 int(topsecret['Port']) 得到 50022,float(topsecret['CompressionLevel']) 得到 9.0。configparser 提供这两个方法,只是把这一步固定下来,省得每次手写。
一个容易踩的点:getint 只接受能转成整数的字符串。如果 INI 里写的是 port = 8080.5,getint 会报错,因为 "8080.5" 不是合法整数。这种情况要用 getfloat。文档对这一点只说明 getint() 在值不是整数时抛出异常,没有展开更多报错细节。
布尔值为什么不能用 bool() 直接判断
这是三个转换方法里最需要单独讲的一个。
假设 INI 里写的是 forward = no。你可能会想:读出来是字符串 "no",用 bool("no") 判断一下不就行了。但 bool("no") 的结果是 True,不是 False。
文档专门解释了这件事:把值直接传给 bool() 没有用,因为 bool('False') 仍然是 True。原因在于 bool() 判断的是“这个对象是不是空的”。对字符串来说,只要它不是空字符串,bool() 就返回 True。"no" 是非空字符串,所以 bool("no") 是 True;"false" 是非空字符串,bool("false") 也是 True;"0" 是非空字符串,bool("0") 还是 True。
也就是说,bool() 回答的是“有没有内容”,不是“这个内容表示真还是假”。INI 里的 no、false、off、0 在语义上是“假”,但它们在 Python 里都是非空字符串,bool() 一律判成 True。
所以布尔值不能靠 bool() 转换,要用 getboolean。
getboolean 认哪些写法:大小写不敏感的四组词
getboolean 会按一套固定的对应关系把字符串转成布尔值。按文档说明,这个方法不区分大小写,认四组写法:
- 表示 True:'1'、'yes'、'true'、'on'
- 表示 False:'0'、'no'、'false'、'off'
对自建样例里的 forward = no,可以这样读:
forward = config.getboolean("server", "forward")
print(forward)结果是 False。如果把 INI 里改成 forward = YES,getboolean 同样返回 True,因为这套对应关系不区分大小写。
需要留意的是,getboolean 只认上面这几组写法。如果 INI 里写的是 forward = nope,getboolean 会报 ValueError,提示这不是一个布尔值。文档给出的例子是 ValueError: Not a boolean: nope。它不会猜,也不会把不认识的词当成 False。
如果你确实需要别的写法,configparser 允许通过 BOOLEAN_STATES 自定义这套对应关系。文档举的例子是把 BOOLEAN_STATES 设为 {'sure': True, 'nope': False} 之后,nope 就能被读成 False。文档还提到其他常见的布尔对,比如 accept/reject 或 enabled/disabled。但这是进阶用法,初学时先把默认的四组词记牢,遇到不认识的写法就改 INI,而不是改代码。
缺项时怎么办:fallback 参数
三个转换方法都支持 fallback 参数。当某个键在 INI 里不存在时,可以用它给一个默认值,而不是让程序报错。
例如自建样例里没有 batch 这个键,直接读会报错。加上 fallback 就可以:
batch = config.getboolean("server", "batch", fallback=True)
print(batch)结果是 True。同样地,getint 和 getfloat 也可以带 fallback:
retries = config.getint("server", "retries", fallback=3)这里有一个顺序要记住:DEFAULT 节里的值优先于 fallback。文档明确写了默认值优先于 fallback 值,并给了例子:CompressionLevel 只在 DEFAULT 节里指定,即使从 topsecret.server.example 节读取时传了 fallback,读到的仍然是 DEFAULT 里的值。fallback 只在键完全找不到时才生效。
对初学者来说,fallback 的用处是让程序在配置缺项时还能跑起来,而不是每次都要保证 INI 写全。
转换失败时怎么排查:先分清两类错误
三个转换方法在值不符合要求时都会报错。文档对 getfloat 的说明是:值不是浮点数时抛出异常;getint 和 getboolean 对各自的类型也这样做。排查时按下面顺序看:
1. 先确认读的是哪个键。节名和键名写错时,报的是找不到键,不是转换失败,这两类错误要分开。
2. 再看值本身是不是符合该方法的类型要求。getint 要求值能转成整数,getfloat 要求值能转成浮点数,getboolean 要求值在那四组词里。
3. 最后看大小写和空格。getboolean 不区分大小写,所以 YES 和 yes 都能读;但值里如果出现四组词之外的写法,比如 nope,仍然会报错。
一个自建排查示例:把 exercise/demo.ini 里的 port 临时改成 port = 8080.5,读的时候用 getint,观察它报错;再改用 getfloat,观察它能读出 8080.5。这样能确认问题出在值和方法是否匹配上,而不是代码写错了。
改完记得改回来。练习文件可以随便改,但不要拿正在用的配置文件做这种试验。
观看知识要点视频 18 秒
18秒无旁白要点导览,文字来自已审核正文;完整步骤、条件及参考资料见下方。
参考资料
以下原始资料提供本文依据;请结合日期、适用条件和产品说明查阅。
请结合原始资料的适用条件阅读。
返回表格与数据 →