将 yaml 转储到变量,而不是使用 ruamel.yaml 将其流式传输到 stdout

Roh*_*ith 6 pyyaml python-3.x ruamel.yaml

我无法找到将 YAML 转储到 ruamel.yaml 中的变量的方法。使用 PyYAML,我可以实现如下所示的相同效果:

with open('oldPipeline.yml','r') as f:
    data = yaml.load(f, Loader=yaml.FullLoader)

a = yaml.dump(data)
Run Code Online (Sandbox Code Playgroud)

但是当我尝试同样的操作时ruamel.yaml,它会抛出异常TypeError: Need a stream argument when not dumping from context manager

Ant*_*hon 5

该错误清楚地表明您应该提供一个流,因此您应该这样做:

import io
import ruamel.yaml

yaml_str = b"""\
fact: The recommended YAML file extension has been .yaml since September 2006
origin: yaml.org FAQ
"""

yaml = ruamel.yaml.YAML()
data = yaml.load(yaml_str)
buf = io.BytesIO()
yaml.dump(data, buf)
assert buf.getvalue() == yaml_str
Run Code Online (Sandbox Code Playgroud)

这不会给出断言错误。

ruamel.yaml 和 PyYAML 使用流接口,很少需要将其写入缓冲区,并且应该避免,因为它效率低下,特别是在常见的 PyYAML 形式中:

print(yaml.dump(data))  # inefficient wrt time and space
Run Code Online (Sandbox Code Playgroud)

而不是更合适的

yaml.dump(data, sys.stdout)
Run Code Online (Sandbox Code Playgroud)

输出的后处理最好在类似流的对象中完成,或者使用 文档的基本用法transform部分中描述的选项。

这里有进一步的解释,当然你也可以查看 PyYAML 是如何做到这一点的。