如何使用PyYAML在YAML序列元素之间添加换行分隔符
解决方法
方法1:逐元素序列化(简单易实现,无需额外配置)
遍历列表中的每个字典单独序列化写入,每次写完一个元素后手动插入空行即可,示例代码如下:
import yaml dict_1 = {'name' : 'name1', 'value' : 12, 'list' : [1, 2, 3], 'type' : 'doc' } dict_2 = {'name' : 'name2', 'value' : 100, 'list' : [1, 2, 3], 'type' : 'cpp' } file_info = [dict_1, dict_2] with open('test_file.yaml', 'w+') as f: for idx, item in enumerate(file_info): # 将单个字典包成列表序列化,自动生成`-`开头的块结构 yaml.dump([item], f) # 最后一个元素无需额外加空行可加此判断,不需要可以直接删 if idx != len(file_info) - 1: f.write('\n')
如果需要保留原字典的键顺序,避免PyYAML默认按字母序重排键,可以在yaml.dump中添加参数sort_keys=False。
方法2:自定义Dumper类(适合批量复用场景)
如果需要在多处分隔序列项,可以继承PyYAML的Dumper类重写序列序列化逻辑,一劳永逸:
import yaml from yaml.dumper import Dumper class SpacedListDumper(Dumper): pass def represent_spaced_sequence(dumper, data): nodes = [dumper.represent_data(item) for item in data] return dumper.represent_sequence('tag:yaml.org,2002:seq', nodes, flow_style=False) SpacedListDumper.add_representer(list, represent_spaced_sequence) # 使用时指定自定义Dumper即可 with open('test_file.yaml', 'w+') as f: yaml.dump(file_info, f, Dumper=SpacedListDumper)
原尝试方案失效原因
往列表中插入\n、None这类元素的方案,会被PyYAML识别为合法的序列项进行序列化,生成- ""、- null这类无效内容,无法达到插入空行的效果。
内容的提问来源于stack exchange,提问作者Tonysres
相关产品推荐
相关产品推荐

