循环重写文件并调用脚本时文件未正确更新问题排查
问题排查与修复方案
你的核心问题是没有接收multiValuesChange函数返回的修改后内容,再加上文件读写逻辑的小疏漏,导致写入文件的始终是原始内容。下面一步步帮你修正:
主要问题分析
- 忽略函数返回值:
multiValuesChange函数已经生成了修改后的文本,但你调用时只是执行multiValuesChange(programFile, valuesDic),没有把结果赋值回programFile,所以原变量完全没变化。 - 文件读写逻辑冗余:先用
r+打开文件读取内容,之后又用w模式重新打开,不仅冗余,还可能因为文件句柄未正确关闭导致意外。 - 变量初始化缺失:代码里
i、node、valuesDic这些变量没有显示初始化,要确保它们在循环前被正确定义(比如i = 0,valuesDic = {})。
修正后的代码
第一部分 - 输入处理(补充细节优化)
import sys import ast from subprocess import call import re if __name__ == '__main__': # 修正参数检查:你用到了sys.argv[1]和sys.argv[3],所以最少需要4个参数 if len(sys.argv) < 4: print "请指定输入文件、节点信息和值列表参数" exit(1) f = sys.argv[1] node = sys.argv[2] # 补充node变量的初始化,匹配你代码中的使用 value_list = ast.literal_eval(sys.argv[3]) # 避免用list做变量名,和内置类型冲突 i = 0 valuesDic = {}
第二部分 - 文件重写(核心修改)
while i < len(value_list): # 单独读取原始文件内容 with open(f, 'r') as file: programFile = file.read() # 更新字典逻辑保持你的原有需求 if i == 0: valuesDic.update({"initialValue": value_list[i]}) else: valuesDic.update({value_list[i-1]: value_list[i]}) # 关键:接收函数返回的修改后内容! modified_content = multiValuesChange(programFile, valuesDic) # 写入修改后的内容到文件 with open(f, 'w') as out_file: out_file.write(modified_content) # 提交任务 call(["qsub","-l","h=node10", f]) i += 1
第三部分 - multiValuesChange函数(无需修改,逻辑正确)
def multiValuesChange(programFile, valuesDic): rc = re.compile('|'.join(map(re.escape, valuesDic))) def translate(match): return valuesDic[match.group(0)] return rc.sub(translate, programFile)
额外优化建议
- 避免用
list作为变量名,它是Python的内置类型,容易引发混淆,改成value_list这类更清晰的名字。 - 可以在每次修改文件前添加备份逻辑,比如复制原始文件到备份目录,避免意外覆盖导致数据丢失。
- 如果值列表较大,考虑用
for循环替代while,代码会更简洁:for idx, val in enumerate(value_list):
内容的提问来源于stack exchange,提问作者fhoenix
相关产品推荐
相关产品推荐

