Python配置文本参数合并更新代码排错与脚本实现
错误点定位
- 核心错误:参数匹配逻辑硬编码截取每行前9位字符判断是否为同一参数,这是
$mu更新失败的直接原因。你的测试文件里$ego_vel=、$ped_vel=刚好长度为9,所以能正常匹配;但$mu=仅4位长度,截取前9位时会把后面的参数值也包含进去,file1中$mu=3的前9位和file2中$mu=6的前9位内容不一致,自然无法触发替换。 - 文件读取笔误:读取file2时,代码错误使用了已经读取完毕、退出with块的
reader1句柄,正常运行这里会直接抛出ValueError。 - 逻辑缺失:现有代码仅替换file1中已存在的参数,没有实现「追加file2独有新参数」的需求。
- 逻辑缺失:代码仅拼接了输出文件路径,没有将最终结果写入outputfile.txt的操作。
- 路径写法不规范:手动拼接
\\再传入os.path.join属于冗余写法,跨平台运行会出现路径错误。
正确实现代码
import os import sys def update_config(file1_dir: str, file1_name: str, file2_dir: str, file2_name: str, out_dir: str, out_name: str): # 拼接各文件完整路径 file1_path = os.path.join(file1_dir, file1_name) file2_path = os.path.join(file2_dir, file2_name) out_path = os.path.join(out_dir, out_name) # 读取原始配置文件,按顺序存储参数 config_lines = [] config_map = {} # key:参数名, value:在config_lines中的索引 with open(file1_path, "r", encoding="utf-8") as f: for idx, line in enumerate(f.readlines()): line = line.rstrip("\n") if not line: continue param_name = line.split("=", 1)[0] # 按第一个=分割取参数名,适配任意长度参数 config_lines.append(line) config_map[param_name] = idx # 读取更新文件,替换已有参数、收集新参数 new_params = [] with open(file2_path, "r", encoding="utf-8") as f: for line in f.readlines(): line = line.rstrip("\n") if not line: continue param_name = line.split("=", 1)[0] if param_name in config_map: # 已有参数直接替换 config_lines[config_map[param_name]] = line else: # 新参数暂存,最后追加 new_params.append(line) # 合并新参数 config_lines.extend(new_params) # 写入输出文件 with open(out_path, "w", encoding="utf-8") as f: for line in config_lines: f.write(line + "\n") if __name__ == "__main__": # 命令行参数顺序和原逻辑保持一致:file1所在目录 file1文件名 file2所在目录 file2文件名 输出目录 输出文件名 update_config( file1_dir=sys.argv[1], file1_name=sys.argv[2], file2_dir=sys.argv[3], file2_name=sys.argv[4], out_dir=sys.argv[5], out_name=sys.argv[6] )
代码说明
- 不再硬编码参数名长度,统一按
=分割提取参数名,适配任意长度的参数名,从根源避免匹配错误。 - 保留原始配置文件的参数顺序,新参数统一追加到文件末尾,和给出的预期输出格式完全一致。
- 修正了文件读取、路径拼接的错误,补充了文件写入逻辑。
- 运行方式和原代码的命令行参数规则一致,不需要调整调用方式。
内容的提问来源于stack exchange,提问作者ashrfa_05
相关产品推荐
相关产品推荐

