我有一个python脚本,它读取一个YAML文件(在嵌入式系统上运行)。没有重音,脚本在我的开发机器和嵌入式系统中正常运行。但是用重音词使其崩溃
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 6: ordinal not in range(128)
仅限于嵌入式环境。
YAML样本:
data: ã
读取YAML的片段:
with open(YAML_FILE, 'r') as stream:
try:
data = yaml.load(stream)
尝试了一堆解决方案但没有成功。
版本:Python 3.6,PyYAML 3.12
答案 0 :(得分:1)
正在读取字节的编解码器已设置为ASCII。这会将您限制为0到127之间的字节值。
Unicode中重音字符的表示超出了此范围,因此您将获得解码错误。
UTF-8编解码器解码ASCII和UTF-8,因为根据设计,ASCII是UTF-8的一个(非常小的)子集。
如果您可以将编解码器更改为UTF-8解码,则应该可以正常工作。
通常,您应该始终指定如何将字节流解码为文本,否则您的流可能不明确。
答案 1 :(得分:1)
您可以指定在使用PyYAML转储数据时应该使用的编解码器,但是在加载时无法在PyYAML中指定编码。但是,PyYAML会将unicode作为输入处理,您可以在打开文件进行读取时明确指定要使用的编解码器,然后使用该编解码器返回文本(将文件作为文本文件打开'r'
,这是open()
的默认值。
import yaml
YAML_FILE = 'input.yaml'
with open(YAML_FILE, encoding='utf-8') as stream:
data = yaml.safe_load(stream)
请注意,您几乎不必使用yaml.load()
,记录为不安全,而是使用yaml.safe_load()
。
要以您加载的格式转储data
,请使用:
import sys
yaml.safe_dump(data, sys.stdout, allow_unicode=True, encoding='utf-8',
default_flow_style=False)
需要default_flow_style
才能获得流式花括号,allow_unicode
是必需的,否则你得到data: "\xE3"
(即unicode字符的转义序列)< / p>