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)
Другие вопросы по тегам