【问题标题】:Unicode error ascii can't encode characterUnicode 错误 ascii 无法编码字符
【发布时间】:2016-06-19 12:49:54
【问题描述】:

我正在尝试导入 csv 文件以训练我的分类器,但我一直收到此错误

traceback (most recent call last):
File "updateClassif.py", line 17, in <module>
myClassif = NaiveBayesClassifier(fp, format="csv")
  File "C:\Python27\lib\site-packages\textblob\classifiers.py", line 191, in __init__
    super(NLTKClassifier, self).__init__(train_set, feature_extractor, format, **kwargs)
  File "C:\Python27\lib\site-packages\textblob\classifiers.py", line 123, in __init__
    self.train_set = self._read_data(train_set, format)
  File "C:\Python27\lib\site-packages\textblob\classifiers.py", line 143, in _read_data
    return format_class(dataset, **self.format_kwargs).to_iterable()
  File "C:\Python27\lib\site-packages\textblob\formats.py", line 68, in __init__
    self.data = [row for row in reader]
  File "C:\Python27\lib\site-packages\textblob\unicodecsv\__init__.py", line 106, in next
    row = self.reader.next()
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe6' in position 55: ordinal not in range(128)

CSV 文件包含 1600000 行推文,所以我相信有些推文包含特殊字符。我已尝试按照某人的建议使用开放式办公室保存它,但结果仍然相同。我也尝试使用拉丁编码,但结果相同。 这是我的代码:

with codecs.open('tr.csv', 'r' ,encoding='latin-1') as fp:
myClassif = NaiveBayesClassifier(fp, format="csv")

这是我正在使用的库中的代码:

def __init__(self, csvfile, fieldnames=None, restkey=None, restval=None,
                 dialect='excel', encoding='utf-8', errors='strict', *args,
                 **kwds):
        if fieldnames is not None:
            fieldnames = _stringify_list(fieldnames, encoding)
        csv.DictReader.__init__(self, csvfile, fieldnames, restkey, restval, dialect, *args, **kwds)
        self.reader = UnicodeReader(csvfile, dialect, encoding=encoding,
                                    errors=errors, *args, **kwds)
        if fieldnames is None and not hasattr(csv.DictReader, 'fieldnames'):
            # Python 2.5 fieldnames workaround. (http://bugs.python.org/issue3436)
            reader = UnicodeReader(csvfile, dialect, encoding=encoding, *args, **kwds)
            self.fieldnames = _stringify_list(reader.next(), reader.encoding)
        self.unicode_fieldnames = [_unicodify(f, encoding) for f in
                                   self.fieldnames]
        self.unicode_restkey = _unicodify(restkey, encoding)

    def next(self):
        row = csv.DictReader.next(self)
        result = dict((uni_key, row[str_key]) for (str_key, uni_key) in
                      izip(self.fieldnames, self.unicode_fieldnames))
        rest = row.get(self.restkey)

【问题讨论】:

  • 请发布回溯的全文。另外,请说明您使用的是哪个版本的 Python。
  • 它可能是 utf=8 编码的。试试看。
  • @tdelaney 我尝试过使用 utf=8,它返回给我:“UnicodeDecodeError: 'utf8' codec can't decode byte 0xe6 in position 35: invalid continuation byte”
  • @MattDMo 我已经发布了回溯的全文,我正在使用 Python 2.7

标签: python python-2.7 csv unicode encoding


【解决方案1】:

在 Python2 中,csv module 不支持 unicode。所以你必须传入某种只产生 byte-strings 的迭代器对象(例如文件)。

这意味着您的代码应如下所示:

with open('tr.csv', 'rb') as fp:
    myClassif = NaiveBayesClassifier(fp, format="csv")

但请注意,csv 文件必须编码为 UTF-8。如果不是,您显然需要先将其转换为 UTF-8,才能使上述代码正常工作。

【讨论】:

    【解决方案2】:

    请注意,回溯说 EncodeError,而不是 DecodeError。看起来 NaiveBayesClassifier 正在期待 ascii。要么让它接受 Unicode,或者,如果这对你的应用程序来说可以,用“?”替换非 ascii 字符。什么的。

    【讨论】:

    • 我已经附上了我正在使用的库中的代码,我应该更改“ encoding = utf-8 ”吗?
    • 如何初始化库?它接受 encoding 参数。您是否尝试将其设置为 latin1?
    • 我正在使用这个库提供的分类器,我只是在导入库:from textblob.classifiers import NaiveBayesClassifier from textblob import TextBlob 我现在尝试使用 latin1 和相同的错误。是否有包含所有字符(包括特殊字符)的编码?
    • 嗯。你能一劳永逸地将输入数据转换为 UTF-8,还是不断变化?
    猜你喜欢
    • 2015-02-03
    • 1970-01-01
    • 2016-01-04
    • 2017-03-31
    • 1970-01-01
    • 2019-09-01
    • 2012-08-19
    • 2018-12-11
    • 1970-01-01
    相关资源
    最近更新 更多