我想收到以下 YAML 文件:
---
classes:
- apache
- ntp
apache::first: 1
apache::package_ensure: present
apache::port: 999
apache::second: 2
apache::service_ensure: running
ntp::bla: bla
ntp::package_ensure: present
ntp::servers: '-'
Run Code Online (Sandbox Code Playgroud)
解析后,我收到这样的输出:
---
apache::first: 1
apache::package_ensure: present
apache::port: 999
apache::second: 2
apache::service_ensure: running
classes:
- apache
- ntp
ntp::bla: bla
ntp::package_ensure: present
ntp::servers: '-'
Run Code Online (Sandbox Code Playgroud)
在这里,我找到了赋予文档样式可能性的属性。我试图设置 line_break 和 indent,但它不起作用。
with open(config['REPOSITORY_PATH'] + '/' + file_name, 'w+') as file:
yaml.safe_dump(data_map, file, indent=10, explicit_start=True, explicit_end=True, default_flow_style=False,
line_break=1)
file.close()
Run Code Online (Sandbox Code Playgroud)
请给我建议设置输出样式的简单方法。
你不能在 PyYAML 中这样做。该indent选项仅影响映射而不影响序列。PyYAML 也不保留往返时映射键的顺序。
如果您使用ruamel.yaml(免责声明:我是该包的作者),那么获得与输出完全相同的输入很容易:
import ruamel.yaml
yaml_str = """\
---
classes:
- apache # keep the indentation
- ntp
apache::first: 1
apache::package_ensure: present
apache::port: 999
apache::second: 2
apache::service_ensure: running
ntp::bla: bla
ntp::package_ensure: present
ntp::servers: '-'
"""
data = ruamel.yaml.round_trip_load(yaml_str)
res = ruamel.yaml.round_trip_dump(data, indent=4, block_seq_indent=2,
explicit_start=True)
assert res == yaml_str
Run Code Online (Sandbox Code Playgroud)
请注意,它还保留了我添加到第一个序列元素的注释。
您可以从“从头开始”构建它,但添加换行符不是调用存在的东西ruamel.yaml:
import ruamel.yaml
from ruamel.yaml.tokens import CommentToken
from ruamel.yaml.error import Mark
from ruamel.yaml.comments import CommentedMap, CommentedSeq
data = CommentedMap()
data['classes'] = classes = CommentedSeq()
classes.append('apache')
classes.append('ntp')
data['apache::first'] = 1
data['apache::package_ensure'] = 'present'
data['apache::port'] = 999
data['apache::second'] = 2
data['apache::service_ensure'] = 'running'
data['ntp::bla'] = 'bla'
data['ntp::package_ensure'] = 'present'
data['ntp::servers'] = '-'
m = Mark(None, None, None, 0, None, None)
data['classes'].ca.items[1] = [CommentToken('\n\n', m, None), None, None, None]
# ^ 1 is the last item in the list
data.ca.items['apache::service_ensure'] = [None, None, CommentToken('\n\n', m, None), None]
res = ruamel.yaml.round_trip_dump(data, indent=4, block_seq_indent=2,
explicit_start=True)
print(res, end='')
Run Code Online (Sandbox Code Playgroud)
您必须将换行符作为注释(不带“ #”)添加到换行符之前的最后一个元素,即最后一个列表元素和apache::service_ensure映射条目。
除此之外,您应该问问自己是否真的想使用 PyYAML,它只支持 2005 年的(大部分)YAML 1.1,而不是 2009 年的最新修订版 YAML 1.2。
您链接到的 wordpress 页面似乎不是很严重(它甚至没有包名称PyYAML,正确)。