【发布时间】:2019-08-16 22:09:59
【问题描述】:
在将 Pandas 数据集保存到 Excel 时,我遇到了
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe6 in position 0: invalid continuation byte
一些挖掘表明我可以将 3 个 ascii 字符放在一起,生成的字符串似乎以 UTF-8 连续字节开头。显然字符串中没有多字节字符。克服这个问题的最佳方法是什么,以便我的所有数据都被解释为 ASCII 字符?
这是演示延续字节如何表现的 Python 代码
Python 3.7.1 (default, Dec 14 2018, 13:28:58)
[Clang 4.0.1 (tags/RELEASE_401/final)] :: Anaconda, Inc. on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> string_from_3_ascii_chars = chr(50) + chr(51) + chr(48)
>>> print(string_from_3_ascii_chars)
230
>>> print(string_from_3_ascii_chars.startswith(str(0xe6)))
True
>>>
【问题讨论】:
-
str(0xe6)是'230'(一个包含三个字符的字符串)——与chr(0xe6)不同,后者是'\xe6'或'æ'(一个包含一个字符的字符串)——同样不是与 byte0xe6相同,就像在字节字符串b'\xe6'中一样。 -
x.startswith('230')为真当且仅当x以字符'2'、'3'和'0'开头。但这与最初提到的 UnicodeDecodeError 完全无关。而且,Python不会将 3 个字符的字符串误解为连续字节。 -
@MrLister 错误消息表明 UTF-8 解码器期望下一个字节是连续字节(二进制
10XXXXXX),但它遇到了E6(11100110)。在保存操作中发生这种情况是相当奇怪的(您宁愿期待 编码 错误,而不是解码问题),但这并非不可能。 -
@lenz 是的,但错误还说“在位置 0”,这是不能出现连续字节的地方。
-
@MrLister 哦,好点。事实上你是对的:错误信息可以用
b'\xe6a'.decode('utf8')来重现
标签: python pandas unicode utf-8