You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python编辑YAML文件时输出缩进、方括号格式不符合预期

问题分析
  • 原始代码存在数据定义错误:nameservers.addresses被定义为包含单个字符串的列表(两个IP被写在同一个引号内),实际应为两个独立IP字符串组成的双元素列表。
  • PyYAML默认序列化规则不符合格式要求:
    • 默认所有列表采用块式输出(逐行以-开头),不会自动将短列表渲染为行内方括号格式
    • 默认统一使用2空格嵌套缩进,无法针对不同层级自定义缩进偏移,和目标格式的缩进规则不匹配
    • 代码中添加的sort_keys=False已经解决了字典键自动排序的问题,这部分配置是正确的
解决方案

如果要求输出和目标格式完全一致,推荐使用ruamel.yaml库(专门用于YAML格式精确控制的库),实现步骤如下:

  1. 安装依赖:
pip install ruamel.yaml
  1. 功能实现代码:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 11:24:15