Python 如何将YAML文本中的元素映射到它们在该文本中的位置?

Python 如何将YAML文本中的元素映射到它们在该文本中的位置?,python,parsing,yaml,Python,Parsing,Yaml,对于YAML编辑器项目,我需要一种在YAML文本中发现解析结构元素的方法,反之亦然 设想一个YAML文件,它表示顶层的列表。移动文本光标(在我要创建的编辑器中)时,我希望光标所在的列表元素得到特殊处理(例如,以特殊方式显示) 另一方面,通过浏览某种可视化结构(例如列表视图),我希望编辑器的光标跳到相应的位置 因此,我认为我需要的只是一个普通的YAML解析器,除了解析的数据结构之外,它还为我提供了JSON文本和解析的数据结构之间类似树的位置映射 因为我的目标是一个嵌入式项目(使用PyQt和pyqt

对于YAML编辑器项目,我需要一种在YAML文本中发现解析结构元素的方法,反之亦然

设想一个YAML文件,它表示顶层的列表。移动文本光标(在我要创建的编辑器中)时,我希望光标所在的列表元素得到特殊处理(例如,以特殊方式显示)

另一方面,通过浏览某种可视化结构(例如列表视图),我希望编辑器的光标跳到相应的位置

因此,我认为我需要的只是一个普通的YAML解析器,除了解析的数据结构之外,它还为我提供了JSON文本和解析的数据结构之间类似树的位置映射

因为我的目标是一个嵌入式项目(使用PyQt和pyqtdeploy),所以最受欢迎的方法是基于普通Python(甚至只使用标准库)。

好的,现在就可以找到。我对提供的答案做了一些改进(为了避免在最终产品中混淆解析的数据和位置),并提出了以下建议:

import yaml, sys

class SafeLineLoader(yaml.loader.SafeLoader):
    def construct_mapping(self, node, deep=False):
        mapping = super().construct_mapping(node, deep=deep)
        mapping['__line__'] = node.start_mark.line + 1
        return mapping

def parse_with_locations(uri):
    locations = {}
    data = yaml.load(open(uri), Loader=SafeLineLoader)
    for elem in data:
        oid, line = id(elem), elem["__line__"]
        locations[line] = oid
        locations[oid] = line
        del elem["__line__"]        
    return data, locations
    
data, locations = parse_with_locations(sys.argv[1])
for l in data:
    print(f"@{locations[id(l)]}: {l}")
注意:此代码有意不处理任意YAML数据,而仅处理列表。(不过可以改进)