Python循环修改YAML文件指定行内容(不新增行)求助
问题原因分析
你的代码只替换第一个变量的问题出在文件指针的位置上:当你第一次循环lambda_inputs的第一个元素时,已经把profile.yaml的所有行都读完了,文件指针移到了文件末尾。后面的循环再去读取文件时,已经没有内容可以读了,所以只有第一个变量addProfile_uri被替换。
解决方案
正确的思路应该是先把YAML文件的全部内容一次性读入内存,然后用JSON里的所有映射关系依次替换内容,最后再写入新文件。这样可以避免文件指针的问题,也更高效。
修改后的代码
import json # 1. 读取JSON文件,构建变量到URI的映射字典 with open('uri_var.json', 'r') as f_json: lambda_inputs = json.load(f_json) uri_mapping = {item['function_variable_uri_name']: item['uri'] for item in lambda_inputs} # 2. 读取YAML文件的全部内容 with open('profile.yaml', 'r') as f_yaml: yaml_content = f_yaml.read() # 3. 依次替换所有变量 for var_name, uri in uri_mapping.items(): yaml_content = yaml_content.replace(var_name, uri) # 4. 将替换后的内容写入新文件 with open('profile_modif.yaml', 'w') as f_out: f_out.write(yaml_content)
代码解释
- 构建映射字典:用字典推导式把JSON里的
function_variable_uri_name和uri对应起来,后续替换时查找更高效。 - 一次性读取YAML内容:把整个文件读成一个字符串,避免了逐行读取时的文件指针问题,也方便多次替换操作。
- 批量替换:遍历映射字典,对整个YAML内容进行多次替换,确保所有匹配的变量都被替换成对应的URI。
- with语句的使用:自动管理文件的打开和关闭,不需要手动调用
close(),更安全简洁。
额外优化建议
如果你的YAML文件非常大,一次性读入内存可能会有问题,可以改用逐行读取并缓存所有行,然后对每一行进行所有替换后再写入:
import json with open('uri_var.json', 'r') as f_json: lambda_inputs = json.load(f_json) uri_mapping = {item['function_variable_uri_name']: item['uri'] for item in lambda_inputs} with open('profile.yaml', 'r') as f_yaml, open('profile_modif.yaml', 'w') as f_out: for line in f_yaml: # 对当前行应用所有替换规则 for var_name, uri in uri_mapping.items(): line = line.replace(var_name, uri) f_out.write(line)
这种方式适合大文件,逐行处理,内存占用更低。
内容的提问来源于stack exchange,提问作者Ouma
相关产品推荐
相关产品推荐

