You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 08:25:12