我正在使用简单的python 3.6脚本加载表情符号字符列表。 YAML结构基本上如下:
- 🙂
- 😁
- 😬
我的python脚本看起来像这样:
import yaml
f = open('emojis.yml')
EMOJIS = yaml.load(f)
f.close()
我收到以下异常:
yaml.reader.ReaderError: unacceptable character #x001d: special characters are not allowed in "emojis.yml", position 2
我已经看到了
allow_unicode=True
选项,但这似乎仅可用于yaml.dump。似乎人们在Python2中遇到了类似问题的麻烦,但是由于所有字符串都应该是unicode,所以我很难弄清楚为什么这样做不起作用。我还尝试过将表情符号包装在引号中,并为“tag:yaml.org,2002:str”使用客户构造函数。我的自定义构造函数甚至从未被击中,因为yaml lib无法识别我的表情符号为字符串类型。当我直接在源代码中将表情符号定义为字符串时,我也会观察到相同的行为。
有没有办法用PyYAML加载包含表情符号的Yaml文件?
最佳答案
您应该升级到 ruamel.yaml
(免责声明:我是该程序包的作者),该程序已解决此问题以及许多其他长期存在的PyYAML问题,已修复:
import sys
from ruamel.yaml import YAML
yaml = YAML()
with open('emojis.yml') as fp:
idx = 0
for c in fp.read():
print('{:08x}'.format(ord(c)), end=' ')
idx += 1
if idx % 4 == 0:
print()
with open('emojis.yml') as fp:
data = yaml.load(fp)
yaml.dump(data, sys.stdout)
给出:
0000002d 00000020 0001f642 0000000a
0000002d 00000020 0001f601 0000000a
0000002d 00000020 0001f62c 0000000a
['🙂', '😁', '😬']
如果您确实必须坚持使用PyYAML,则可以执行以下操作:
import yaml.reader
import re
yaml.reader.Reader.NON_PRINTABLE = re.compile(
u'[^\x09\x0A\x0D\x20-\x7E\x85\xA0-\uD7FF\uE000-\uFFFD\U00010000-\U0010FFFF]')
摆脱错误。
从0.15.16版本开始,
ruamel.yaml
现在还转储所有补充平面Unicode,而无需恢复为\Uxxxxxxxx
(可通过.unicode_supplementary
在新API中进行控制,具体取决于allow_unicode
)。关于python - 使用PyYaml加载特殊字符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44875403/