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 _
相关产品推荐
相关产品推荐

