使用Python编辑YAML文件时输出缩进、方括号格式不符合预期
问题分析
- 原始代码存在数据定义错误:
nameservers.addresses被定义为包含单个字符串的列表(两个IP被写在同一个引号内),实际应为两个独立IP字符串组成的双元素列表。 - PyYAML默认序列化规则不符合格式要求:
- 默认所有列表采用块式输出(逐行以
-开头),不会自动将短列表渲染为行内方括号格式 - 默认统一使用2空格嵌套缩进,无法针对不同层级自定义缩进偏移,和目标格式的缩进规则不匹配
- 代码中添加的
sort_keys=False已经解决了字典键自动排序的问题,这部分配置是正确的
- 默认所有列表采用块式输出(逐行以
解决方案
如果要求输出和目标格式完全一致,推荐使用ruamel.yaml库(专门用于YAML格式精确控制的库),实现步骤如下:
- 安装依赖:
pip install ruamel.yaml
- 功能实现代码:
from ruamel.yaml import YAML from ruamel.yaml.comments import CommentedSeq # 修正数据结构错误 add_info = { 'network': { 'version': 2, 'renderer': 'networkd', 'ethernets': { 'enx1': { 'addresses': ['193.254.1.6/24'], 'nameservers': { # 用CommentedSeq包裹需要单独设置格式的列表 'addresses': CommentedSeq(['193.254.1.5', '8.8.8.8']) }, 'routes': [ { 'to': '193.254.1.0/24', 'via': '193.254.1.5' } ] } } } } # 初始化YAML实例,配置格式规则 yaml = YAML() yaml.default_flow_style = False yaml.width = 1000 # 禁止长行自动折行 # 缩进规则:字典项缩进2空格,列表项缩进4空格,列表符号-相对偏移2空格 yaml.indent(mapping=2, sequence=4, offset=2) # 单独指定nameservers下的addresses列表使用行内方括号格式 add_info['network']['ethernets']['enx1']['nameservers']['addresses'].fa.set_flow_style() # 写入文件 with open('/etc/netplan/01-network-manager-test.yaml', 'w') as f: yaml.dump(add_info, f)
运行后输出的内容和目标格式完全一致。
注:如果不追求格式完全对齐,只要求YAML内容合法可被netplan识别,原生PyYAML输出的文件本身没有语法问题,可以直接使用,缩进和列表展示形式的差异不影响配置生效。
内容的提问来源于stack exchange,提问作者roXx
相关产品推荐
相关产品推荐

