YAML中的块和流格式与Python的混合
我正在尝试使用Python和pyyaml更改深入嵌套在YAML文件中的值。我需要保留格式,它是块和流的组合 我想更改嵌套在字典中的单个值,该值位于结构的几层深处。例如,我可能会将x值更改为2: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 我已经能够导入数据,更改值,并使用块格式或默认格式转储文件,但两者都不完全匹配我需要的格式。有没有
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个缩进。非常感谢!你的包裹正是我所需要的。