如何在Groovy中获取YAML文件里键值对的行号?
获取YAML键值对行号的实现方法
可以用Python的YAML处理库来实现,下面是两种常用方案:
PyYAML 自定义构造器
PyYAML本身支持通过节点对象获取位置信息,我们可以自定义加载器来捕获每个键值对的行号:
import yaml from yaml.nodes import MappingNode class LineNumberLoader(yaml.SafeLoader): def construct_mapping(self, node: MappingNode, deep=False): mapping = super().construct_mapping(node, deep=deep) # 遍历每个键值节点,提取行号 for key_node, value_node in node.value: key = self.construct_object(key_node) mapping[key] = { 'value': self.construct_object(value_node), 'line': key_node.start_mark.line + 1 # 转成从1开始的自然行号 } return mapping # 加载YAML文件 with open('test.yaml', 'r') as f: data = yaml.load(f, Loader=LineNumberLoader) # 输出结果 for key, info in data.items(): print(f"键: {key}, 值: {info['value']}, 行号: {info['line']}")
ruamel.yaml 原生支持位置信息
ruamel.yaml专门针对YAML的原始结构保留做了优化,自带行号标记功能,用起来更简便:
from ruamel.yaml import YAML yaml = YAML() yaml.preserve_quotes = True # 可选,保留原文件的引号格式 with open('test.yaml', 'r') as f: data = yaml.load(f) # 遍历键值对并提取行号 for key, value in data.items(): line_num = data.lc.key(key) + 1 # 转成从1开始的行号 print(f"键: {key}, 值: {value}, 行号: {line_num}")
注意事项
- 两个库的节点行号默认都是从0开始计数,所以需要加1转换成日常使用的从1开始的行号。
- 如果YAML包含嵌套的映射结构,只需要递归处理对应的节点即可,逻辑和上述示例一致。
内容的提问来源于stack exchange,提问作者bharathi
相关产品推荐
相关产品推荐

