在python中一次解析一个yaml列表元素

在python中一次解析一个yaml列表元素,python,yaml,Python,Yaml,python中是否有一个yaml库可以根据需要一次读取一个输入文件或条目,而不是解析整个文件?我有一个长文件,它的根节点是list。如果我试图找到满足某个属性的第一个元素,我可能不需要读取和解析整个文件,从而更快地得到结果。您可以使用PyYAML的低级parse()API: import yaml for event in yaml.parse(input): # process event 事件记录在案 如果要将根级别序列的每个项构造为本机Python值,则需要使用Composer

python中是否有一个yaml库可以根据需要一次读取一个输入文件或条目,而不是解析整个文件?我有一个长文件,它的根节点是list。如果我试图找到满足某个属性的第一个元素,我可能不需要读取和解析整个文件,从而更快地得到结果。

您可以使用PyYAML的低级
parse()
API:

import yaml

for event in yaml.parse(input):
    # process event
事件记录在案

如果要将根级别序列的每个项构造为本机Python值,则需要使用
Composer
构造函数
Composer
读取事件并将其转换为节点,
Constructor
从节点构建Python值。这与YAML规范中定义的加载过程相对应:

现在PyYAML的
Composer
期望函数
get_event
check_event
peek_event
存在于
self
上,但没有实现它们。它们由
解析器实现。因此,为了有一个工作的YAML装载链,PyYAML稍后将执行以下操作:

class Loader(Reader, Scanner, Parser, Composer, Constructor, Resolver):
  def __init__(self, stream):
    Reader.__init__(self, stream)
    Scanner.__init__(self)
    Parser.__init__(self)
    Composer.__init__(self)
    Constructor.__init__(self)
    Resolver.__init__(self)
对于您来说,这意味着您需要一个
加载器
对象,并使用
解析器
API来处理顶级事件,同时使用
编写器
构造函数
API来加载顶级序列中的每个项

下面是一些让您开始学习的代码:

import yaml

input = """
- "A": 1
- "B": 2
- foo
- 1
"""

loader = yaml.SafeLoader(input)

# check proper stream start (should never fail)
assert loader.check_event(yaml.StreamStartEvent)
loader.get_event()
assert loader.check_event(yaml.DocumentStartEvent)
loader.get_event()

# assume the root element is a sequence
assert loader.check_event(yaml.SequenceStartEvent)
loader.get_event()

# now while the next event does not end the sequence, process each item
while not loader.check_event(yaml.SequenceEndEvent):
    # compose current item to a node as if it was the root node
    node = loader.compose_node(None, None)
    # construct a native Python value with the node.
    # we set deep=True for complete processing of all the node's children
    value = loader.construct_object(node, True)
    print(value)

# assume document ends and no further documents are in stream
loader.get_event()
assert loader.check_event(yaml.DocumentEndEvent)
loader.get_event()
assert loader.check_event(yaml.StreamEndEvent)

请注意,如果YAML文档中有锚和别名,您可能会遇到问题。

这似乎与我要查找的完全一样,但在查看文档后,我仍然不理解API的这一部分是如何工作的。例如,如果我的yaml输入是
”-“A”:1\n-“B”:2'
,我如何逐个解析外部列表的元素?我是否以某种方式将函数绑定到事件类型?添加了示例代码以演示从事件子列表构造值