You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 11:10:41