ruamel.yaml 转储列表而不在末尾添加新行

ruamel.yaml dump lists without adding new line at the end

我尝试使用以下代码片段将字典对象转储为 YAML:

from ruamel.yaml import YAML
# YAML settings
yaml = YAML(typ="rt")
yaml.default_flow_style = False
yaml.explicit_start = False
yaml.indent(mapping=2, sequence=4, offset=2)

rip= {"rip_routes": ["23.24.10.0/15", "23.30.0.10/15", "50.73.11.0/16", "198.0.0.0/16"]}

file = 'test.yaml'
with open(file, "w") as f:
    yaml.dump(rip, f)

转储正确,但我在列表末尾附加了一个新行

   rip_routes:
      - 23.24.10.0/15
      - 23.30.0.10/15
      - 198.0.11.0/16

我不想在文件末尾插入新行。我该怎么做?

换行符是块样式序列元素的表示代码的一部分。并且由于该代码 对上下文了解不多,当然也不了解表示要转储的最后一个元素 在文档中,最后的换行符不输出几乎是不可能的。

但是,.dump() 方法有一个可选的 transform 参数,允许您 运行 通过某些过滤器转储文本的输出:

import sys
import pathlib
import string
import ruamel.yaml

# YAML settings
yaml = ruamel.yaml.YAML(typ="rt")
yaml.default_flow_style = False
yaml.explicit_start = False
yaml.indent(mapping=2, sequence=4, offset=2)

rip= {"rip_routes": ["23.24.10.0/15", "23.30.0.10/15", "50.73.11.0/16", "198.0.0.0/16"]}

def strip_final_newline(s):
    if not s or s[-1] != '\n':
        return s
    return s[:-1]

file = pathlib.Path('test.yaml')
yaml.dump(rip, file, transform=strip_final_newline)

print(repr(file.read_text()))

给出:

'rip_routes:\n  - 23.24.10.0/15\n  - 23.30.0.10/15\n  - 50.73.11.0/16\n  - 198.0.0.0/16'

最好像上面的代码那样使用Path()个实例, 特别是如果您的 YAML 文档将包含非 ASCII 字符。