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 字符。
我尝试使用以下代码片段将字典对象转储为 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 字符。