如何用Python更新.conf配置文件中指定键的取值?
解决.conf文件键值对更新问题
你的原代码存在几个明显问题,导致无法正常更新配置:
- 第二个正则替换逻辑错误:将
key3=.*替换成了key1=%s,且取值误用了conf['key1'],完全不符合需求 - 重复调用
rstrip()会丢失行尾空白字符,破坏原文件格式 - 硬编码键名,无法适配字典中新增的键,扩展性差
修复后的基础版本
这个版本针对你原有的需求,修正了错误:
import fileinput import re CONF = "your_config.conf" # 替换为你的配置文件实际路径 def save_settings(conf): for line in fileinput.input(files=[CONF], inplace=True): # 仅去除换行符,保留其他空白格式 line_content = line.rstrip('\n') # 更新key1 line_content = re.sub(r'key1=.*', f'key1={conf["key1"]}', line_content) # 修正key3的替换逻辑 line_content = re.sub(r'key3=.*', f'key3={conf["key3"]}', line_content) print(line_content) return "true" # 调用示例 conf = {'key1': 'newvalue1', 'key3': 'newvalue3'} save_settings(conf)
更通用的优化版本
如果后续需要更新更多键,推荐用这个无需硬编码键名的版本:
import fileinput import re CONF = "your_config.conf" def save_settings(conf): for line in fileinput.input(files=[CONF], inplace=True): line_content = line.rstrip('\n') # 遍历字典中的所有键值对,逐一匹配更新 for key, new_val in conf.items(): # 精确匹配行首的目标键,避免误匹配类似key10的键 pattern = re.compile(r'^' + re.escape(key) + r'=.*') if pattern.match(line_content): line_content = f'{key}={new_val}' break # 匹配到后跳出循环,避免重复处理 print(line_content) return "true" # 调用示例 conf = {'key1': 'newvalue1', 'key3': 'newvalue3'} save_settings(conf)
这个通用版本的优势:
- 自动适配字典中的所有键,新增键时无需修改函数代码
- 用
re.escape(key)处理键中的特殊字符,避免正则语法冲突 - 匹配行开头的键,防止误匹配类似
key12=xxx的行 - 保留原文件未修改行的格式和换行
内容的提问来源于stack exchange,提问作者ppb
相关产品推荐
相关产品推荐

