在python中一次解析一个yaml列表元素
python中是否有一个yaml库可以根据需要一次读取一个输入文件或条目,而不是解析整个文件?我有一个长文件,它的根节点是list。如果我试图找到满足某个属性的第一个元素,我可能不需要读取和解析整个文件,从而更快地得到结果。您可以使用PyYAML的低级在python中一次解析一个yaml列表元素,python,yaml,Python,Yaml,python中是否有一个yaml库可以根据需要一次读取一个输入文件或条目,而不是解析整个文件?我有一个长文件,它的根节点是list。如果我试图找到满足某个属性的第一个元素,我可能不需要读取和解析整个文件,从而更快地得到结果。您可以使用PyYAML的低级parse()API: import yaml for event in yaml.parse(input): # process event 事件记录在案 如果要将根级别序列的每个项构造为本机Python值,则需要使用Composer
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'
,我如何逐个解析外部列表的元素?我是否以某种方式将函数绑定到事件类型?添加了示例代码以演示从事件子列表构造值