Python 2.7 - как записать проанализированную информацию MeCab в текстовый файл?
Я написал графический интерфейс, который позволяет японский ввод, и когда вы идете в файл> анализировать записи в текстовый файл. Этот текстовый файл затем запускается через MeCab, где между словами ставятся пробелы. После этого он должен быть снова записан в текстовый файл, чтобы его можно было отобразить в другом окне графического интерфейса.
Проблема в том, что я не хочу записывать проанализированные данные в текстовый файл. Это не проблема писать это в первый раз. Кроме того, он печатает разобранную информацию в IDLE, также не проблема. Вот парсер и ошибка:
#!/usr/bin/python
# -*- coding: <utf-8> -*-
import sys
import MeCab
import codecs
read_from = open("pholder.txt").read()
mecab = MeCab.Tagger("-Owakati")
output = mecab.parse(read_from)
print output
text = output
write_to = codecs.open("pholder.txt", "w", "utf-8")
write_to.write(text)
write_to.close()
Traceback (most recent call last):
File "C:\...\mecabSpaces.py", line 16, in <module>
write_to.write(text)
File "C:\...\codecs.py", line 691, in write
return self.writer.write(data)
File "C:\...\codecs.py", line 351, in write
data, consumed = self.encode(object, self.errors)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)
2 ответа
Анализируемые данные не являются Unicode, это строка байтов.
Поэтому, когда вы пытаетесь записать данные в файл, он пытается декодировать их в Unicode, прежде чем кодировать их в utf-8
, Так как ваш кодек по умолчанию ascii
, но у вас действительно есть utf-8
, он подавляется первым символом со значением байта 128 или выше.
Вам следует .decode('utf-8')
возвращенные данные, или же использовать mecab
метод, который возвращает данные Unicode.
Вот рабочий код. Спасибо agf за то, что помог мне вытащить голову из задницы.
#!/usr/bin/python
# -*- coding: <utf-8> -*-
import MeCab
read_from = open("pholder.txt", "r").read()
mecab = MeCab.Tagger("-Owakati")
output = mecab.parse(read_from)
print output
text = output
write_to = open("pholder.txt", "w").write(text)