如何遍历两个文件的行对比数值,满足条件时更新目标文件对应值?
代码存在的核心问题
- 内层
for line in Lines循环逻辑错误:循环结束后tmp仅保留Density.topo最后一行的拆分结果,无法匹配每行的对应参数 - 拆分得到的
tmp[2]、tmp[3]是字符串类型,直接和整数1、0做相等判断永远返回False,不会进入替换逻辑 - 拆分得到的
tmp1是列表类型,没有replace方法,直接调用会触发语法错误 - 先写入原始行
row、再写入修改后行的逻辑会导致行重复,不符合修改需求 - 使用Python内置关键字
list作为变量名,会覆盖内置功能,存在语法隐患 oldFileName读取完成后未关闭文件,存在资源泄漏
修正后的可运行代码
oldFileName = 'tryout.hmo' newFileName = 'tryout_NEW.hmo' topoFileName = 'Density.topo' # 预先读取拓扑文件并按首字段存为映射字典 topo_map = {} with open(topoFileName, "r") as f: for line in f.readlines(): tmp = line.split() if tmp: # 跳过空行 topo_map[tmp[0]] = tmp # 处理原文件写入新文件 with open(oldFileName, "r") as f_old, open(newFileName, "w") as f_new: oldLines = f_old.readlines() in_elem_section = False # 标记是否进入元素数据段 for row in oldLines: # 检测到段起始标记 if row.find("BEG_ELEM_DATA") > -1: in_elem_section = True f_new.write(row) continue # 不在目标段直接写原行 if not in_elem_section: f_new.write(row) continue # 在目标段内处理替换 row_stripped = row.rstrip() tmp1 = row_stripped.split() if not tmp1: # 跳过空行 f_new.write(row) continue # 匹配拓扑文件的对应记录 if tmp1[0] in topo_map: tmp = topo_map[tmp1[0]] # 按规则替换第二个字段 if tmp[2] == '1' and tmp[3] == '0': tmp1[1] = "18" elif tmp[2] == '1' and tmp[3] == '1': tmp1[1] = "19" else: tmp1[1] = "20" # 拼接为字符串写入,保留原行尾换行 f_new.write(" ".join(tmp1) + "\n") else: # 没有匹配到的行写原内容 f_new.write(row)
修正说明
- 改用
with语句管理文件操作,自动关闭文件避免资源泄漏 - 预先把
Density.topo的内容按首字段存为字典,方便快速匹配对应记录 - 增加段标记位,仅对
BEG_ELEM_DATA之后的行做修改,避免误改其他内容 - 字符串与整数的判断逻辑做了类型对齐,确保替换分支可以正常触发
- 列表元素直接修改后重新拼接为字符串写入,不会重复写入原始行
- 增加空行容错逻辑,避免文件空行导致程序报错
内容的提问来源于stack exchange,提问作者Sagar
相关产品推荐
相关产品推荐

