如何使用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
相关产品推荐
相关产品推荐

