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

Python+PyYAML如何移除大括号内字符串的单引号?

解决PyYAML输出无引号字符串问题

问题根源

PyYAML会自动为包含特殊语法(如{})或可能被解析为布尔值(true/false)的字符串添加引号,避免解析歧义。要强制输出无引号格式,需要自定义字符串类型并指定序列化规则。

解决方案

1. 自定义无引号字符串类型

创建一个继承自str的子类,用于标记需要无引号输出的字符串:

class UnquotedStr(str):
    pass

2. 注册自定义序列化器

为这个类编写并注册一个YAML序列化器,指定输出时不使用引号:

import yaml

def represent_unquoted_str(dumper, data):
    return dumper.represent_scalar('tag:yaml.org,2002:str', data, style=None)

yaml.add_representer(UnquotedStr, represent_unquoted_str)

3. 修改数据赋值

将需要无引号输出的字符串用UnquotedStr包裹,替代普通字符串:

data = {}
data.update({'dev_class': UnquotedStr('{child}')})
# 处理true/false的情况同理
data.update({'status': UnquotedStr('true')})

4. 执行dump操作

保持原dump参数不变即可:

with open("package.yaml", 'w', encoding='utf-8') as f:
    yaml.dump(data, f, allow_unicode=True, encoding='utf-8', sort_keys=False, width=float("inf"))

注意事项

  • 不要用集合({'moisture'})来实现无引号输出,YAML中集合会被序列化为!!set格式,和你需要的字符串完全不同。
  • 仅对确实不需要引号的字符串使用UnquotedStr,避免破坏YAML的语法合法性(比如包含特殊字符但必须加引号的场景)。

内容的提问来源于stack exchange,提问作者Unknown _

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 05:10:18