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

问题描述 投票:0回答:1

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

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

a = yaml.dump(data)

但是当我对ruamel.yaml尝试相同时,它会引发TypeError异常TypeError: Need a stream argument when not dumping from context manager

有人可以在这里帮助我吗!!

python-3.x pyyaml ruamel.yaml
1个回答
0
投票

错误明确表明您应该提供流,所以您应该这样做:

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

没有断言错误。

ruamel.yaml和PyYAML使用流接口,并将其写入缓冲区是几乎没有必要,并且由于效率低下而应避免使用,尤其是以常见的PyYAML形式:

print(yaml.dump(data))  # inefficient wrt time and space

而不是更合适的

yaml.dump(data, sys.stdout)

输出的后处理最好在类似对象,或使用transform中描述的Basic Usage选项文档部分。

进一步解释here,当然您也可以查找了PyYAML如何做到这一点。

© www.soinside.com 2019 - 2024. All rights reserved.