使用Python的configparser读取ini配置文件时出现KeyError: 'user'是什么原因
问题解答
错误含义
KeyError: 'user'是Python的标准字典访问异常,含义是你尝试访问的键名在目标字典中不存在。从错误栈可以看到异常触发在config["books"]["user"]这行代码,说明ConfigParser读取内容后,要么没有加载到[books]配置节点,要么[books]节点下没有user这个配置项。
为什么你配置文件里写了user还会报错?
你提供的config.ini内容本身没有问题,触发错误的核心原因绝大多数情况是程序没有成功读取到config.ini文件,而非配置项缺失:
config.read("config.ini")使用了相对路径,只会在你执行Python命令的当前工作目录查找配置文件,不会自动从代码文件db.py所在的目录查找。如果运行脚本的工作目录和config.ini存放目录不一致,就会读取失败,ConfigParser对象内没有任何配置项,自然就会抛出KeyError。- 小概率原因包括
config.ini编码异常、文件权限不足导致ConfigParser无法正常解析文件内容。
修复方案
方案1:使用绝对路径读取配置(适合本地测试)
直接写死配置文件的完整路径,避免相对路径查找失败的问题:
config.read("/home/vojtam/Desktop/mydb/config.ini")
方案2:动态拼接配置路径(适配多环境)
通过代码自动获取当前脚本所在目录,拼接配置文件路径,不管在哪个工作目录执行都能正确找到配置:
import os from configparser import ConfigParser import pymysql as mysql class DatabaseG: def __init__(self): config = ConfigParser() # 获取当前db.py文件所在的目录 current_dir = os.path.dirname(os.path.abspath(__file__)) # 拼接得到config.ini的绝对路径 config_path = os.path.join(current_dir, "config.ini") config.read(config_path) # 可选:加配置校验,提前暴露问题 if not config.sections(): raise FileNotFoundError(f"配置文件{config_path}读取失败,请检查路径/权限/编码是否正常") if "books" not in config: raise ValueError("配置文件中缺失[books]节点") self.connection = mysql.connect( user=config["books"]["user"], passwd=config["books"]["password"], host=config["books"]["host"], db=config["books"]["database"], ) self.cursor = self.connection.cursor() # 提示:原SQL中book_id未指定字段类型,执行会报错,需补全类型,示例如下 query = """ CREATE TABLE BOOKS (book_url TEXT, book_id INT) """ self.cursor.execute(query) db = DatabaseG()
额外提示:你原有代码中的建表SQL语法不完整,
book_id字段没有指定类型,后续执行会抛出SQL语法错误,上述修复代码中已经做了示例修改,你可以根据实际需求调整字段类型。
内容的提问来源于stack exchange,提问作者vojta
相关产品推荐
相关产品推荐

