我正在使用简单的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/

10-12 16:57
查看更多