如何让ruamel.yaml的YAML.dump()输出双引号格式的YAML?
解决方案:让YAML输出中空字符串默认使用双引号
针对你遇到的问题——将Pydantic模型转成的字典写入YAML时,希望空字符串自动以双引号输出,无需递归遍历修改每个字符串,可以通过自定义YAML表示器实现全局生效,无需繁琐的手动转换。
方法1:使用ruamel.yaml(推荐,支持preserve_quotes等特性)
如果你使用的是支持preserve_quotes的ruamel.yaml,可以通过注册自定义字符串表示器,让空字符串强制使用双引号:
from ruamel.yaml import YAML # 初始化YAML实例 yaml = YAML() # 自定义字符串表示器:空字符串用双引号,其他保持默认 def str_representer(dumper, data): if data == "": return dumper.represent_scalar('tag:yaml.org,2002:str', data, style='"') # 非空字符串沿用原有处理逻辑 return dumper.represent_scalar('tag:yaml.org,2002:str', data) # 注册表示器到YAML实例 yaml.representer.add_representer(str, str_representer) # 测试Pydantic模型转字典的场景 from pydantic import BaseModel class MyModel(BaseModel): empty_str: str = "" normal_str: str = "example" model = MyModel() # 写入YAML文件 yaml.dump(model.dict(), open("output.yaml", "w"))
输出的YAML内容会是:
empty_str: "" normal_str: example
方法2:使用PyYAML(标准yaml库)
如果使用的是原生PyYAML库,写法类似,同样通过注册表示器实现:
import yaml # 自定义字符串表示器 def str_presenter(dumper, data): if data == "": return dumper.represent_scalar('tag:yaml.org,2002:str', data, style='"') return dumper.represent_scalar('tag:yaml.org,2002:str', data) # 全局注册表示器 yaml.add_representer(str, str_presenter) # 测试输出 data = {"empty": "", "content": "hello"} print(yaml.dump(data))
输出结果:
empty: "" content: hello
为什么之前自定义表示器无效?
大概率是表示器的注册方式错误,或者没有覆盖默认的str类型处理逻辑:
- 确保注册的是
str类型的表示器,而非其他派生类型 - 检查
style参数是否正确传入双引号('"') - 使用ruamel.yaml时,要注册到
yaml.representer而非全局
注意事项
这种方式是全局生效的,所有空字符串在dump时都会自动转为双引号格式,无需递归遍历字典修改DoubleQuotedScalarString,完全满足你的优化需求。
内容的提问来源于stack exchange,提问作者Michał Zawadzki
相关产品推荐
相关产品推荐

