ConfigParser读取已赋值文件对象失败问题咨询
为什么复用文件对象读取配置时configparser返回空sections?
哈哈,这个问题我之前调试的时候也踩过一模一样的坑!咱们来拆解下你遇到的情况:
你第一次用config.read_file(open('review-stats.cfg'))能正常读到['global'],但第二次把文件对象赋值给f再调用config2.read_file(f)就返回空sections,核心原因是文件对象的位置指针在搞鬼。
问题本质
当你用open()打开文件后,文件对象会维护一个「当前读取位置指针」。如果这个指针已经移动到了文件末尾(比如你在交互环境中不小心执行过f.read()查看内容,或者某些隐式操作触发了读取),后续调用read_file()时,会从指针当前位置开始读取——也就是从文件末尾读,自然读不到任何配置内容。
而第一种写法config.read_file(open('review-stats.cfg'))每次都会创建一个全新的文件对象,这个新对象的指针默认在文件开头,所以能正常解析配置。
解决办法
给你几个实用的处理方式:
- 重置文件指针:如果一定要复用同一个文件对象,在读取前把指针移回文件开头:
import configparser config2 = configparser.ConfigParser() f = open('review-stats.cfg') f.seek(0) # 关键:把指针重置到文件起始位置 config2.read_file(f) print(config2.sections()) # 现在就能读到['global']了 - 重新打开文件:每次读取配置时都新建文件对象,避免指针问题:
config2.read_file(open('review-stats.cfg')) - 更简便的
read()方法:其实configparser提供了更省心的read()方法,直接传文件名就行,它会内部处理文件的打开、读取和关闭,完全不用操心指针问题:config2.read('review-stats.cfg')
关于后续恢复正常的原因
你说后来相同步骤又正常了,大概率是因为这次重新打开文件时,文件指针默认在开头,没有之前的读取操作干扰,所以就能正常解析啦。
内容的提问来源于stack exchange,提问作者Mattia Verga
相关产品推荐
相关产品推荐

