You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优雅地从自定义配置文件中提取键值对赋值给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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 14:30:01