Python UnicodeDecodeError在处理重音词时出错

Python UnicodeDecodeError在处理重音词时出错,python,yaml,python-3.6,pyyaml,Python,Yaml,Python 3.6,Pyyaml,我有一个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: tr

我有一个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

读取字节的编解码器已设置为ASCII。这将您限制为0到127之间的字节值

Unicode中重音字符的表示形式超出了此范围,因此会出现解码错误

UTF-8编解码器对ASCII和UTF-8进行解码,因为ASCII在设计上是UTF-8的一个子集(非常小)

如果您可以将编解码器更改为UTF-8解码器,它应该可以工作


一般来说,您应该始终指定如何将字节流解码为文本,否则,您的流可能不明确。

读取字节的编解码器已设置为ASCII。这将您限制为0到127之间的字节值

Unicode中重音字符的表示形式超出了此范围,因此会出现解码错误

UTF-8编解码器对ASCII和UTF-8进行解码,因为ASCII在设计上是UTF-8的一个子集(非常小)

如果您可以将编解码器更改为UTF-8解码器,它应该可以工作


一般来说,您应该始终指定如何将字节流解码为文本,否则,您的流可能会不明确。

您可以指定在使用PyYAML转储数据时应使用的编解码器,但无法在加载时指定PyYAML编码。但是PyYAML将unicode作为输入处理,并且您可以明确指定在打开文件进行读取时使用哪个编解码器,然后使用该编解码器返回文本(您使用
'r'
作为文本文件打开文件,这是
open()
的默认设置)

请注意,您几乎不必使用
yaml.load()
,这被证明是不安全的,而是使用
yaml.safe\u load()

要以加载的相同格式转储
数据
,请使用:

import sys
yaml.safe_dump(data, sys.stdout, allow_unicode=True, encoding='utf-8',
               default_flow_style=False)

需要使用
默认的\u flow\u样式
,以避免获得流样式的大括号,并且需要使用
允许unicode
,否则您将获得
数据:“\xE3”
(即unicode字符的转义序列)

您可以指定在使用PyYAML转储数据时应使用的编解码器,但在加载时,无法指定用PyYAML编写的代码。但是PyYAML将unicode作为输入处理,并且您可以明确指定在打开文件进行读取时使用哪个编解码器,然后使用该编解码器返回文本(您使用
'r'
作为文本文件打开文件,这是
open()
的默认设置)

请注意,您几乎不必使用
yaml.load()
,这被证明是不安全的,而是使用
yaml.safe\u load()

要以加载的相同格式转储
数据
,请使用:

import sys
yaml.safe_dump(data, sys.stdout, allow_unicode=True, encoding='utf-8',
               default_flow_style=False)

需要使用
默认的\u flow\u样式
,以避免使用流样式的大括号,并且需要使用
允许unicode
,否则您将获得
数据:“\xE3”
(即unicode字符的转义序列)

UTF-8 everywhere的这一原则是一个很好的通用国际化建议,无论你使用什么技术。目前的HTML5.3草案正在朝着只支持UTF-8Ok的方向发展。谢谢你的回答。它使用utf-8编码加载文件。但是之后,当我尝试访问dict中的一个键时,抛出了相同的错误。尽管这意味着另一个UTF-8错误,但很难准确猜测到底发生了什么。我建议你把这个问题变成另一个问题,有它自己的具体细节。UTF-8 everywhere的这个原则是一个很好的通用国际化建议,无论你使用什么技术。目前的HTML5.3草案正在朝着只支持UTF-8Ok的方向发展。谢谢你的回答。它使用utf-8编码加载文件。但是之后,当我尝试访问dict中的一个键时,抛出了相同的错误。尽管这意味着另一个UTF-8错误,但很难准确猜测到底发生了什么。我建议您将此问题转化为另一个问题,并提供它自己的具体细节。该代码段不会从文件中读取YAML文档,它有语法错误(除之外没有任何
),
YAML_文件
未定义且未导入。始终发布完整的最少示例,在不知道和/或无法访问嵌入式系统的情况下,重现类似问题是非常困难的。让回答者容易些,这是为了你自己的利益。您甚至可以在不尝试加载as YAML的情况下获得此错误,只要读取文件就应该足够了,因为代码段没有从文件中读取YAML文档,它有语法错误(除
之外没有),
YAML\u文件
未定义且
YAML
未导入。始终发布完整的最少示例,在不知道和/或无法访问嵌入式系统的情况下,重现类似问题是非常困难的。让回答者容易些,这是为了你自己的利益。您甚至不需要尝试加载asyaml就可以得到这个错误,只要读取文件就足够了