使用yaml.SafeDumper时如何保留YAML原格式?
解决方案
要保留原YAML中的双引号字符串格式和行内数组格式,需要通过自定义PyYAML的Dumper类,分别重写字符串和列表的序列化逻辑:
1. 强制字符串使用双引号输出
PyYAML默认会根据字符串内容自动判断是否加引号,我们可以自定义字符串的representer,强制所有字符串用双引号包裹。
2. 强制列表使用行内(Flow)格式
默认列表会被序列化为多行block格式,需要修改列表的representer,指定使用flow style输出。
完整修改代码
import yaml class MyDumper(yaml.SafeDumper): def write_line_break(self, data=None): super().write_line_break(data) if len(self.indents) == 1: super().write_line_break() if len(self.indents) == 2: super().write_line_break() # 自定义字符串representer:强制双引号 def str_presenter(dumper, data): return dumper.represent_scalar('tag:yaml.org,2002:str', data, style='"') # 自定义列表representer:强制行内格式 def list_presenter(dumper, data): return dumper.represent_sequence('tag:yaml.org,2002:seq', data, flow_style=True) # 注册自定义规则 MyDumper.add_representer(str, str_presenter) MyDumper.add_representer(list, list_presenter) # 读取YAML的函数不变 def open_file(input_file): with open(input_file, encoding="utf8") as file: return_file = yaml.safe_load(file) return return_file # 导出YAML的函数 def dump_file(runtime_file, output_file_name): with open(output_file_name, "w", encoding="utf8") as dump_file: yaml.dump(runtime_file, dump_file, Dumper=MyDumper, sort_keys=False, allow_unicode=True)
测试效果
使用上述代码处理后,导出的YAML内容会和原文件一致:
Version: "1.0" title1: "Title 1" title2: [Title 2]
说明
str_presenter函数通过style="'"指定字符串用双引号序列化;list_presenter函数通过flow_style=True强制列表使用行内方括号格式;- 把这两个规则注册到自定义的
MyDumper中,就能在dump时应用这些格式规则。
内容的提问来源于stack exchange,提问作者Marc
相关产品推荐
相关产品推荐

