YAML列表>Python生成器?

2024-09-30 01:25:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我想知道是否有一种简单的方法来解析由条目列表组成的YAML文档,作为PyYAML的python生成器。在

例如,给定文件

# foobar.yaml
---
- foo: ["bar", "baz", "bah"]
  something_else: blah
- bar: yet_another_thing

我想做些类似的事情

^{pr2}$

我知道有全部加载,它可以实现类似的功能,但您需要将每个记录视为自己的文档。我之所以这么问是因为我有一些非常大的文件,我想转换成YAML,然后用低内存占用进行解析。在

我看了一下PyYAML事件API,但它吓到了我=)


Tags: 文件方法文档yaml列表foobar条目
1条回答
网友
1楼 · 发布于 2024-09-30 01:25:48

我能理解Events API让你害怕,它只会给你带来这么多。首先,您需要跟踪深度(因为您有顶级复杂的序列项,以及“bar”、“baz”等)。 而且,在正确地剪切低级别序列事件元素之后,您必须将它们输入到编写器中以创建节点(最终是Python对象),这一点也不简单。在

但是由于YAML使用缩进,即使对于跨越多行的标量,您也可以使用一个简单的基于行的解析器来识别每个序列元素的起始位置,并一次一个地将这些元素输入正常的load()函数:

#/usr/bin/env python

import ruamel.yaml

def list_elements(fp, depth=0):
    buffer = None
    in_header = True
    list_element_match = ' ' * depth + '- '
    for line in fp:
        if line.startswith(' -'):
            in_header = False
            continue
        if in_header:
            continue
        if line.startswith(list_element_match):
            if buffer is None:
                buffer = line
                continue
            yield ruamel.yaml.load(buffer)[0]
            buffer = line
            continue
        buffer += line
    if buffer:
       yield ruamel.yaml.load(buffer)[0]


with open("foobar.yaml") as fp:
   for element in list_elements(fp):
       print(str(element))

导致:

^{pr2}$

我在这里使用了PyYAML的增强版,ruamel.yaml,但PyYAML应该以同样的方式工作。在

相关问题 更多 >

    热门问题