UnicodeDecodeError:'utf8'编解码器无法解码字节“0xc3”

时间:2013-08-23 13:19:26

标签: python

在python 2.7中我有这个:

# -*- coding: utf-8 -*-
from nltk.corpus import abc
with open("abc.txt","w") as f:
    f.write(" ".join(i.words()))

然后我尝试在Python 3中阅读本文档:

 with open("abc.txt", 'r', encoding='utf-8') as f:
     f.read()

只得到:

  File "C:\Python32\lib\codecs.py", line 300, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xc3 in position 633096: invalid continuation byte

我做错了什么? Notepad ++似乎表明该文档是Unicode utf-8。即使我尝试使用Notepad ++将文档转换为此格式,我仍然在python 3中得到此错误,这很奇怪,因为我读了许多其他utf-8编码的文档没有任何问题。

2 个答案:

答案 0 :(得分:2)

我的猜测是您的输入编码为ISO-8859-2,其中包含Ă 0xC3。检查输入文件的编码。

答案 1 :(得分:2)

基于你的Python 2.7没有抛出异常的事实,我推断i.words()返回一个字节串序列。这些不太可能以UTF8编码 - 我猜可能是Latin-1或类似的东西。然后将它们写入文件。此时没有编码。

您可能需要将这些转换为unicode字符串,您需要知道它们的现有编码,然后在编写文件时需要将它们编码为UTF-8。

例如:

# -*- coding: utf-8 -*-
from nltk.corpus import abc
import codecs
with codecs.open("abc.txt","w","utf-8") as f:
    f.write(u" ".join(codecs.decode(word,"latin-1") for word in i.words()))

进一步说明,如果有任何混淆:

  • -*- coding: utf-8 -*-行指的是用于编写Python脚本本身的编码。它对该脚本的输入或输出没有影响。
  • 在Python 2.7中,有两种字符串:bytestrings,它们是具有未指定编码的字节序列,以及unicode字符串,它们是unicode代码点的序列。字节串是最常见的,如果您使用常规"abc"字符串文字语法,则会获得。 Unicode字符串是您使用u"abc"语法时获得的字符串。
  • 在Python 2.7中,如果您只是使用open函数打开文件并向其写入字节串,则不会进行编码。 bytestring的字节直接写入文件。如果您尝试将unicode字符串写入其中,如果它们包含无法由默认(ASCII)编解码器编码的字符,则会出现异常。