处理重音词时出现 UnicodeDecodeError
UnicodeDecodeError while processing Accented words
我有一个 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)
尝试了很多解决方案都没有成功。
版本:Python3.6,PyYAML 3.12
正在读取您的字节的编解码器已设置为 ASCII。这将您的字节值限制在 0 到 127 之间。
Unicode 中重音字符的表示超出了此范围,因此您遇到了解码错误。
UTF-8 编解码器解码 ASCII 和 UTF-8,因为 ASCII 是 UTF-8 的(非常小的)子集,这是设计的。
如果您可以将编解码器更改为 UTF-8 解码器,它应该可以工作。
一般来说,您应该始终指定将字节流解码为文本的方式,否则,您的流可能不明确。
您可以指定使用 PyYAML 转储数据时应使用的编解码器,但无法在加载时指定 PyYAML 中的编码。但是 PyYAML 将处理 unicode 作为输入,并且您可以在打开文件进行阅读时明确指定要使用的编解码器,然后将该编解码器用于 return 文本(您将文件作为文本文件打开 '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 字符的转义序列)
我有一个 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)
尝试了很多解决方案都没有成功。
版本:Python3.6,PyYAML 3.12
正在读取您的字节的编解码器已设置为 ASCII。这将您的字节值限制在 0 到 127 之间。
Unicode 中重音字符的表示超出了此范围,因此您遇到了解码错误。
UTF-8 编解码器解码 ASCII 和 UTF-8,因为 ASCII 是 UTF-8 的(非常小的)子集,这是设计的。
如果您可以将编解码器更改为 UTF-8 解码器,它应该可以工作。
一般来说,您应该始终指定将字节流解码为文本的方式,否则,您的流可能不明确。
您可以指定使用 PyYAML 转储数据时应使用的编解码器,但无法在加载时指定 PyYAML 中的编码。但是 PyYAML 将处理 unicode 作为输入,并且您可以在打开文件进行阅读时明确指定要使用的编解码器,然后将该编解码器用于 return 文本(您将文件作为文本文件打开 '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 字符的转义序列)