如何优雅地从自定义配置文件中提取键值对赋值给Python变量
优化实现方案
方案1:直接分割键值对(最推荐,无需正则)
你的配置格式是标准的冒号分隔键值对,完全不需要逐一定义匹配规则,直接按行分割即可:
from sys import argv config = {} with open(argv[1], 'r', encoding='utf-8') as config_file: for line in config_file: # 去除首尾换行、空格等空白字符 cleaned_line = line.strip() # 跳过空行 if not cleaned_line: continue # 只按第一个冒号分割,避免值本身包含冒号(如URL中的http://)被误切割 key, value = cleaned_line.split(':', maxsplit=1) config[key.strip()] = value.strip() # 直接从字典读取所需参数 jira_url = config['jira_url'] auth_user = config['auth_user'] auth_token = config['auth_token']
这个方案的优势:
- 不需要硬编码键名对应的切片长度,后续修改配置键名不用调整代码
- 自动处理换行符,不需要写
split("\n")[0]这类冗余代码 - 自动跳过空行,兼容性更好
- 后续新增配置项不需要修改解析逻辑,直接从config字典取值即可
方案2:正则优化版(如果你需要保留正则匹配逻辑)
如果一定要用正则匹配,可以预编译正则规则批量处理,不用为每个键单独写匹配逻辑:
import re from sys import argv config = {} # 预编译正则,分组匹配键和值 pattern = re.compile(r'^([a-z_]+):(.*)$', re.IGNORECASE) with open(argv[1], 'r', encoding='utf-8') as config_file: for line in config_file: match_res = pattern.match(line) if match_res: key, value = match_res.groups() config[key.strip()] = value.strip() # 取值逻辑和方案1一致
冗余写法的替代
你觉得繁琐的line[10:].split("\n")[0]可以直接替换为line[10:].strip(),strip()方法默认会移除字符串首尾的所有空白字符,包括换行符、空格、制表符,写法更简洁。
关于match对象复用的疑问
你用的re.match()是单次匹配函数,每次调用都会针对传入的模式和字符串执行一次独立的匹配运算,匹配成功返回新的Match对象,失败返回None。你每次要匹配的是不同的键名前缀,属于完全独立的匹配操作,自然无法复用同一个Match对象,每次匹配都要生成新的结果。
另外注意你原有代码里有个小问题:匹配auth_token的规则少写了末尾的冒号,写成了match('auth_token', line),可能会导致匹配错误,建议修正为match('auth_token:', line)。
内容的提问来源于stack exchange,提问作者Wanstronian
相关产品推荐
相关产品推荐

