如何使用Ruamel在插入的YAML节点后添加换行符?
如何使用Ruamel在插入的YAML节点后添加换行符?
我完全懂你现在的烦恼——用ruamel.yaml插入新节点node_c后,它和后面的node_b紧紧贴在一起,怎么都弄不出空行,试了好几种方法要么注释没了,要么生成奇怪的无效YAML节点对吧?别着急,我来给你说清楚问题出在哪,以及怎么解决。
问题根源
你之前尝试的几种方法都没切中要害:
yaml_set_comment_before_after_key的after参数,是用来给键的后面加内联注释(比如node_c: value_c # 这里是after的注释),根本不是用来控制节点间空行的;- 给
insert方法加注释参数,ruamel.yaml会默认把它当成行尾注释处理,自然会带上#符号,这也不是你要的效果。
解决方案
要在node_c和node_b之间添加空行,我们需要利用ruamel.yaml的Comment对象来控制节点后的输出换行。具体来说,就是给node_c这个节点设置post属性,让输出时在它后面多打一个空行。
修改你的代码如下:
for key, value in dict.items(): with open(value["yaml_filepath"], mode='r', newline='', encoding='utf-8') as file: data = ru_yaml.load(file) or {} if not isinstance(data, ruamel.yaml.comments.CommentedMap): data = ruamel.yaml.comments.CommentedMap(data) # 插入新节点 data.insert(1, "node_c", value["nodes_value"]) # 添加节点前的注释 data.yaml_set_comment_before_after_key("node_c", before="Comment") # 关键步骤:给node_c节点后面添加空行 if "node_c" in data.ca.items: # 获取该节点的Comment对象 comm_obj = data.ca.items["node_c"] # 设置post属性:第一个元素None表示无注释内容,第二个是空行 comm_obj.post = [None, '\n'] # 务必保存修改后的YAML到文件 with open(value["yaml_filepath"], mode='w', newline='', encoding='utf-8') as file: ru_yaml.dump(data, file, default_flow_style=False, allow_unicode=True)
原理说明
ruamel.yaml的CommentedMap中,每个节点的注释和格式控制信息都存在data.ca.items里:
before属性控制节点前的注释(就是你用yaml_set_comment_before_after_key设置的内容);post属性控制该节点输出后的内容,我们把它设为[None, '\n'],就告诉ruamel.yaml:输出完node_c后额外打印一个空行,这样node_b就会自动下移一行,和node_c之间留出你需要的空白。
另外要注意:你之前的代码片段里省略了保存文件的步骤,一定要用ru_yaml.dump把修改后的data写回原文件,不然所有修改都不会生效哦。
备注:内容来源于stack exchange,提问作者livisaur
相关产品推荐
相关产品推荐

