数组在 PyYAML 中没有缩进或 space
Array does not have indent or space in PyYAML
在下面的代码中,我创建了 net_plan_dict
变量字典并将其转换为 YAML 格式文件。
在字典中,我有一个名为 addresses
的字段,它是一个包含三个元素的数组。
创建 YAML 文件后,三个数组元素未放在 addresses
字段下:
import yaml
net_plan_dict = {
'networking': {
'addresses': ['192.168.1.1', '192.168.1.2', "192.168.1.3"],
'gateway4': '192.168.121.1'
}
}
with open("new.yaml", "w") as f:
yaml.dump(net_plan_dict, f)
以上代码的输出结果如下(在下面的文件中,IP不在地址下方,没有space或缩进)。
new.yaml:
networking:
addresses:
- 192.168.1.1 <-------- does not have indent
- 192.168.1.2
- 192.168.1.3
gateway4: 192.168.121.1
但我的目标是获取此输出文件(当 ips 在地址字段下时如何创建此文件):
networking:
addresses:
- 192.168.1.1
- 192.168.1.2
- 192.168.1.3
gateway4: 192.168.121.1
PyYAML 的 dump()
没有很好的控制来为不同的缩进
映射(2 个位置)和序列(4 个位置),也不能在内部偏移序列指示符 (-
)
(序列)缩进的 space。
如果你想要对你的输出进行那种控制,你应该使用 ruamel.yaml
(免责声明:我是那个包的作者):
import sys
import ruamel.yaml
net_plan_dict = {
'networking': {
'addresses': ['192.168.1.1', '192.168.1.2', "192.168.1.3"],
'gateway4': '192.168.121.1'
}
}
yaml = ruamel.yaml.YAML()
yaml.indent(mapping=2, sequence=4, offset=2)
yaml.dump(net_plan_dict, sys.stdout)
给出:
networking:
addresses:
- 192.168.1.1
- 192.168.1.2
- 192.168.1.3
gateway4: 192.168.121.1
我想到了另一个解决方案。把它留给其他可怜的灵魂。像
一样使用
yaml.dump(obj, Dumper=m2p.utils.prettyyaml.PrettyDumper)
import yaml.emitter
import yaml.serializer
import yaml.representer
import yaml.resolver
class IndentingEmitter(yaml.emitter.Emitter):
def increase_indent(self, flow=False, indentless=False):
"""Ensure that lists items are always indented."""
return super().increase_indent(
flow=False,
indentless=False,
)
class PrettyDumper(
IndentingEmitter,
yaml.serializer.Serializer,
yaml.representer.Representer,
yaml.resolver.Resolver,
):
def __init__(
self,
stream,
default_style=None,
default_flow_style=False,
canonical=None,
indent=None,
width=None,
allow_unicode=None,
line_break=None,
encoding=None,
explicit_start=None,
explicit_end=None,
version=None,
tags=None,
sort_keys=True,
):
IndentingEmitter.__init__(
self,
stream,
canonical=canonical,
indent=indent,
width=width,
allow_unicode=allow_unicode,
line_break=line_break,
)
yaml.serializer.Serializer.__init__(
self,
encoding=encoding,
explicit_start=explicit_start,
explicit_end=explicit_end,
version=version,
tags=tags,
)
yaml.representer.Representer.__init__(
self,
default_style=default_style,
default_flow_style=default_flow_style,
sort_keys=sort_keys,
)
yaml.resolver.Resolver.__init__(self)
向 saneyaml 大声疾呼。
在下面的代码中,我创建了 net_plan_dict
变量字典并将其转换为 YAML 格式文件。
在字典中,我有一个名为 addresses
的字段,它是一个包含三个元素的数组。
创建 YAML 文件后,三个数组元素未放在 addresses
字段下:
import yaml
net_plan_dict = {
'networking': {
'addresses': ['192.168.1.1', '192.168.1.2', "192.168.1.3"],
'gateway4': '192.168.121.1'
}
}
with open("new.yaml", "w") as f:
yaml.dump(net_plan_dict, f)
以上代码的输出结果如下(在下面的文件中,IP不在地址下方,没有space或缩进)。
new.yaml:
networking:
addresses:
- 192.168.1.1 <-------- does not have indent
- 192.168.1.2
- 192.168.1.3
gateway4: 192.168.121.1
但我的目标是获取此输出文件(当 ips 在地址字段下时如何创建此文件):
networking:
addresses:
- 192.168.1.1
- 192.168.1.2
- 192.168.1.3
gateway4: 192.168.121.1
PyYAML 的 dump()
没有很好的控制来为不同的缩进
映射(2 个位置)和序列(4 个位置),也不能在内部偏移序列指示符 (-
)
(序列)缩进的 space。
如果你想要对你的输出进行那种控制,你应该使用 ruamel.yaml
(免责声明:我是那个包的作者):
import sys
import ruamel.yaml
net_plan_dict = {
'networking': {
'addresses': ['192.168.1.1', '192.168.1.2', "192.168.1.3"],
'gateway4': '192.168.121.1'
}
}
yaml = ruamel.yaml.YAML()
yaml.indent(mapping=2, sequence=4, offset=2)
yaml.dump(net_plan_dict, sys.stdout)
给出:
networking:
addresses:
- 192.168.1.1
- 192.168.1.2
- 192.168.1.3
gateway4: 192.168.121.1
我想到了另一个解决方案。把它留给其他可怜的灵魂。像
一样使用yaml.dump(obj, Dumper=m2p.utils.prettyyaml.PrettyDumper)
import yaml.emitter
import yaml.serializer
import yaml.representer
import yaml.resolver
class IndentingEmitter(yaml.emitter.Emitter):
def increase_indent(self, flow=False, indentless=False):
"""Ensure that lists items are always indented."""
return super().increase_indent(
flow=False,
indentless=False,
)
class PrettyDumper(
IndentingEmitter,
yaml.serializer.Serializer,
yaml.representer.Representer,
yaml.resolver.Resolver,
):
def __init__(
self,
stream,
default_style=None,
default_flow_style=False,
canonical=None,
indent=None,
width=None,
allow_unicode=None,
line_break=None,
encoding=None,
explicit_start=None,
explicit_end=None,
version=None,
tags=None,
sort_keys=True,
):
IndentingEmitter.__init__(
self,
stream,
canonical=canonical,
indent=indent,
width=width,
allow_unicode=allow_unicode,
line_break=line_break,
)
yaml.serializer.Serializer.__init__(
self,
encoding=encoding,
explicit_start=explicit_start,
explicit_end=explicit_end,
version=version,
tags=tags,
)
yaml.representer.Representer.__init__(
self,
default_style=default_style,
default_flow_style=default_flow_style,
sort_keys=sort_keys,
)
yaml.resolver.Resolver.__init__(self)
向 saneyaml 大声疾呼。