在python中加载文件时出现UnicodeDecodeError

时间:2016-07-29 17:16:24

标签: python character-encoding environment

我正在运行:

news_train = load_mlcomp('20news-18828', 'train')
vectorizer = TfidfVectorizer(encoding='latin1')
X_train = vectorizer.fit_transform((open(f, errors='ignore').read()
                                for f in news_train.filenames))

但它有UnicodeDecodeError:'utf-8'编解码器无法解码位置39的字节0xe4:无效的连续字节。在open()函数。

我检查了news_train.filenames。它是:

array(['/Users/juby/Downloads/mlcomp/379/train/sci.med/12836-58920',
       ..., '/Users/juby/Downloads/mlcomp/379/train/sci.space/14129-61228'], 
      dtype='<U74')

路径看起来正确。它可能是关于dtype或我的环境(我是Mac OSX 10.11),但我尝试了很多次后无法修复它。谢谢!!!

这是来自http://scikit-learn.org/stable/auto_examples/text/mlcomp_sparse_document_classification.html#example-text-mlcomp-sparse-document-classification-py

的ML教程

2 个答案:

答案 0 :(得分:0)

我找到了解决方案。使用

open(f, encoding = "latin1")

我不确定为什么它只发生在我的Mac上。希望了解它。

答案 1 :(得分:0)

实际上在Python 3+中,open函数打开并以默认模式'r'读取文件,该模式将解码文件内容(在大多数平台上,以UTF-8格式)。由于您的文件是以latin1编码的,因此使用UTF-8对其进行解码可能会导致UnicodeDecodeError。解决方案是以二进制模式打开文件('rb'),或指定正确的编码(encoding="latin1")。

open(f, 'rb').read()  # returns `byte` rather than `str`
# or,
open(f, encoding='latin1').read()  # returns latin1 decoded `str`