Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
YAML中的块和流格式与Python的混合_Python_Yaml_Pyyaml - Fatal编程技术网

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

YAML中的块和流格式与Python的混合,python,yaml,pyyaml,Python,Yaml,Pyyaml,我正在尝试使用Python和pyyaml更改深入嵌套在YAML文件中的值。我需要保留格式,它是块和流的组合 我想更改嵌套在字典中的单个值,该值位于结构的几层深处。例如,我可能会将x值更改为2: a: b: c: {x:1, y:1} d: {r1: 2, r2: 4} e: f: 1 g: 1 我已经能够导入数据,更改值,并使用块格式或默认格式转储文件,但两者都不完全匹配我需要的格式。有没有

我正在尝试使用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仅支持所有流(
默认流样式=True
)、所有块(
默认流样式=False
)或具有集合叶节点流(默认)的所有块开箱即用

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

是的,注释也被保留。

您的
c
值可能在冒号(
{x:1,y:1}
后有空格)。我不确定Pyaml是否正确地解析了它。这是否必须与PyYAML一起使用(即,您是否只希望支持过时的YAML 1.1标准)?我的ruamel.yaml循环使用这个“开箱即用”的方法,只需为映射指定4个缩进。非常感谢!你的包裹正是我所需要的。