2016-03-05 2 views
-1

Я пытаюсь импортировать файл CSV, чтобы тренировать классификатор, но я продолжаю получать эту ошибкуUnicode ошибка ASCII не может кодировать символ

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) 
+0

Пожалуйста, разместите ** полный текст ** следа. Также укажите, какую версию Python вы используете. – MattDMo

+0

Скорее всего, он равен utf = 8. Попробуй это. – tdelaney

+0

@tdelaney Я попытался с utf = 8, и он возвращает мне это: «UnicodeDecodeError:« utf8 »кодек не может декодировать байт 0xe6 в позиции 35: недопустимый байт продолжения« – Pca

ответ

0

В Python2 не поддерживает юникод. Таким образом, вы должны передать какой-то объект итератора (например, файл), который производит только байт-строки.

Это означает, что ваш код должен выглядеть следующим образом:

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

Но обратите внимание, что файл CSV должен быть закодирован как UTF-8. Если это не так, вам, очевидно, нужно будет сначала преобразовать его в UTF-8, чтобы код выше работал.

0

Обратите внимание, что отладочные говорит En codeError, не DecodeError. Похоже, что NaiveBayesClassifier ожидает ascii. Либо заставить его принимать Unicode, либо, если это подходит для вашего приложения, замените символы не-ascii на «?» или что-то.

+0

Я добавил код выше из библиотеки, которую я использую, должен ли я изменить «encoding = utf-8»? – Pca

+0

Как вы инициализируете свою библиотеку? Он принимает аргумент 'encoding'. Вы пытались установить его на latin1? –

+0

Я использую классификатор, предоставляемый этой библиотекой, и я просто импортирую библиотеку: из textblob.classifiers импортировать файл NaiveBayesClassifier из текстового импорта importBlob TextBlob Я попытался использовать latin1 и ту же ошибку. Есть ли кодировка, содержащая все символы, включая специальные? – Pca

Смежные вопросы