繁体   English   中英

将 YAML 中的块和流格式与 Python 混合

[英]Mixing block and flow formatting in YAML with Python

我正在尝试使用 Python 和 pyyaml 更改深度嵌套在 YAML 文件中的值。 我需要保留格式,这是块和流的组合。

我想更改嵌套在字典中多层结构深处的单个值。 例如,我可能会将 x 值更改为 2:

a:
    b:
        c: {x:1, y:1}
        d: {r1: 2, r2: 4}
        e:
            f: 1
            g: 1

我已经能够导入数据、更改值并使用块格式或默认格式转储文件,但两者都与我需要的格式不完全匹配。 有没有办法混合格式或只更改目标值而不重写整个文件?

您可能应该超越 PyYAML,问题之一是它将您的{x:1, y:1}构造到 Python dict {"x": 1, "y": 1}应该构造为{"x:1": None, "y:1": None} ,因为冒号后没有空格并且标量没有双引号。

假设您想要第一个 Python 表示,即使您不想将 YAML 更改为正确的并依赖 PyYAML 对其的错误解释,PyYAML 也不会在没有冒号后的额外空间的情况下转储它,从而更改您的文件。

我建议您查看 ruamel.yaml(免责声明:我是该包的作者),除了更正您的输入 YAML 之外,您唯一需要做的就是将映射的缩进设置为 4(默认为 2)。

ruamel.yaml 还支持在块样式下嵌套流样式节点,其中 PyYAML 仅支持全流( default-flow-style=True )、全块( default-flow-style=False )或 all-block-with-collection -leaf-nodes-flow(默认)开箱即用

import sys
import ruamel.yaml

yaml_str = """\
a:
    b:
        c: {x: 1, y: 1}  # these need spaces after the colon
        d: {r1: 2, r2: {r3: 3, r4: 4}}
        e:
            f: 1
            g: 1
"""

yaml = ruamel.yaml.YAML()
yaml.indent(mapping=4)
data = yaml.load(yaml_str)
yaml.dump(data, sys.stdout)

这使:

a:
    b:
        c: {x: 1, y: 1}  # these need spaces after the colon
        d: {r1: 2, r2: {r3: 3, r4: 4}}
        e:
            f: 1
            g: 1

是的,评论也被保留了下来。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM