在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编码的文档没有任何问题。
答案 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脚本本身的编码。它对该脚本的输入或输出没有影响。"abc"
字符串文字语法,则会获得。 Unicode字符串是您使用u"abc"
语法时获得的字符串。