ruamel.yaml 0.17.16 python3 UnicodeEncodeError

ruamel.yaml 0.17.16 python3 UnicodeEncodeError

我用的是python3.5.2,ruamel.yaml版本是0.17.16, 当我使用 ruamel_yaml.dump(content, fp) 时,出现错误

"UnicodeEncodeError: 'ascii' codec can't encode character '\u2019' in position 434: ordinal not in range(128)"

在 ruamel/yaml/emitter.py write_comment 函数上。

而且我设置了ruamel_yaml.encoding = True,读取文件的时候我也设置了encoding='UTF-8',没用。

然后我改成了python3.7,没有UnicodeEncodeError错误,但是我发现生成的文件有错误'utf-8'错误。

ruamel.yaml 需要匹配哪个 python 版本吗? 或者如何解决这个问题?

我不确定为什么您在使用不同的 Python 版本时没有收到任何错误和不同的结果。 AFAICT 没有关于处理文件的 3.5 或 3.7 特定内容。 尽管生命周期结束 Python 3.5 仍受支持和测试。

你没有提供太多代码(你应该),但是从错误我可以告诉你尝试转储一些东西 带右单引号(,Unicode 代码点 2019).

您应该包含更多代码,以便清楚文件的打开方式,并包含 您在哪个平台上 运行 您的代码 (Windows)。你很可能是你 写入文本文件( open('somefile.yaml') ),您应该在其中写入为二进制文件打开的文件 ( open('somefile.yaml', 'wb') )

YAML() 实例的属性 .encoding 默认设置为 utf-8, 所以再次设置将没有效果。

import sys
import pathlib
import ruamel.yaml

data = dict(text="here comes the unicode quote -> \u2019")
print('python version:', sys.version_info)

yaml = ruamel.yaml.YAML()
yaml_file = pathlib.Path('somefile.yaml')

# You can open the Path like this, but it is better to have ruamel.yaml do it
# with yaml_file.open('wb') as fp:
#     yaml.dump(data, fp)

yaml.dump(data, yaml_file)

readback = yaml_file.read_bytes()
print('{:02x}{:02x}{:02x}'.format(readback[-4], readback[-3], readback[-2]))

给出:

python version: sys.version_info(major=3, minor=5, micro=9, releaselevel='final', serial=0)
e28099

这是正确的单引号的预期 UTF-8 编码。