如何使用ruamel.yaml.dump去除YAML输出中的单引号
解决ruamel.yaml转换字典时字符串带单引号的问题
问题描述
期望的YAML输出:
quickSearch: type: string maxLength: 250 pattern: [a-zA-Z0-9.\-_\u4e00-\u9fa5]+
实际输出(正则字符串被自动添加单引号):
quickSearch: type: string maxLength: 250 pattern: '[a-zA-Z0-9.\-_\u4e00-\u9fa5]+'
相关代码:
from ruamel.yaml import YAML yaml = YAML() param_dict = { "quickSearch": { "type": "string", "maxLength": 250, "pattern": "", } } pattern = "[a-zA-Z0-9.\-_\\u4e00-\\u9fa5]+" param_dict["quickSearch"]["pattern"] = pattern with open("config.yaml", 'w', encoding='utf-8-sig') as f: yaml.dump(param_dict, f)
解决方案
ruamel.yaml会自动给包含YAML特殊元字符(如[]、+、\-)的字符串添加引号,避免解析歧义。要实现无引号输出,可通过以下两种方式处理:
方法一:针对特定字符串强制无引号输出
导入ruamel.yaml.scalarstring.PlainScalarString,将需要无引号展示的字符串包装为该类型,直接强制YAML以纯文本形式输出:
from ruamel.yaml import YAML from ruamel.yaml.scalarstring import PlainScalarString yaml = YAML() param_dict = { "quickSearch": { "type": "string", "maxLength": 250, "pattern": "", } } pattern = "[a-zA-Z0-9.\-_\\u4e00-\\u9fa5]+" # 用PlainScalarString包装字符串,消除自动添加的引号 param_dict["quickSearch"]["pattern"] = PlainScalarString(pattern) with open("config.yaml", 'w', encoding='utf-8-sig') as f: yaml.dump(param_dict, f)
方法二:全局禁用自动引号
如果需要所有字符串都以无引号形式输出,可设置yaml.default_style为空字符串,全局统一字符串输出风格(注意:若字符串包含YAML语法冲突字符如:、换行符,可能导致解析错误,需确保所有字符串无此类字符):
from ruamel.yaml import YAML yaml = YAML() # 全局设置所有字符串使用无引号的纯文本风格 yaml.default_style = '' param_dict = { "quickSearch": { "type": "string", "maxLength": 250, "pattern": "", } } pattern = "[a-zA-Z0-9.\-_\\u4e00-\\u9fa5]+" param_dict["quickSearch"]["pattern"] = pattern with open("config.yaml", 'w', encoding='utf-8-sig') as f: yaml.dump(param_dict, f)
内容的提问来源于stack exchange,提问作者user24271142
相关产品推荐
相关产品推荐

