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

如何使用ruamel-yaml dump保留emoji并维持引号格式?

问题

用ruamel-yaml处理带emoji的YAML文件时遇到矛盾:开启preserve_quotes=True能保留字符串的引号,但emoji会被转成\U0001F4DA这种Unicode转义串;关闭该参数后,emoji能正常显示,但字符串的引号会丢失。

原YAML文件(t.yml):

# filename: t.yml
text: "Docs 📚"

测试代码:

import sys
from ruamel.yaml import YAML

yaml = YAML()
yaml.preserve_quotes = True
yaml.indent(mapping=2, sequence=4, offset=2)
yaml.width = 1024
yaml.encoding = "utf-8"

with open("t.yml") as f:
    data = yaml.load(f)

yaml.dump(data, sys.stdout)

开启preserve_quotes的输出:

text: "Docs \U0001F4DA"

关闭preserve_quotes的输出:

text: Docs 📚
解决办法

给YAML对象添加allow_unicode=True配置,即可同时保留引号和原emoji。

修改后的代码:

import sys
from ruamel.yaml import YAML

yaml = YAML()
yaml.preserve_quotes = True
yaml.allow_unicode = True  # 新增该行配置
yaml.indent(mapping=2, sequence=4, offset=2)
yaml.width = 1024
yaml.encoding = "utf-8"

with open("t.yml") as f:
    data = yaml.load(f)

yaml.dump(data, sys.stdout)

运行后输出:

text: "Docs 📚"
原理说明

当preserve_quotes=True时,ruamel-yaml会严格保留原始的字符串节点格式,但默认会将非ASCII字符(比如emoji)转义为Unicode编码格式。开启allow_unicode=True后,序列化过程会直接输出UTF-8编码的字符,不再对emoji等非ASCII字符进行转义,从而同时满足保留引号和显示原emoji的需求。

内容的提问来源于stack exchange,提问作者J L

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 10:32:53