2011-10-25 9 views
2

私は、日本語入力が可能なGUIを書いています。また、ファイル>構文解析を行ってテキストファイルに書き込む場合もあります。そのテキストファイルは、単語の間にスペースを入れるMeCabを介して実行されます。その後、もう一度テキストファイルに書き込まれるはずなので、別のGUIウィンドウに表示することができます。Python 2.7 - 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) 
+0

正確に 'mecab.parse()'は何を返しますか?では、コマンドプロンプトで 'mecab.parse(read_from)'と入力するとどうなりますか? –

+0

parse関数は、Tagger関数が解析する方法を解析します。それは私がそれを理解する方法です。 – jeffberhow

+0

申し訳ありませんが、改ページでコメントする方法はありません。これは、スペースでテストを区切る1行の解析です。print MeCab.Tagger( ' - Owakati')。parse( 'testtesttest') – jeffberhow

答えて

4

解析されたデータは、バイト文字列だ、ユニコードではありません。

ファイルにデータを書き込むしようとするので、それはutf-8にそれを符号化する前にUnicodeにデコードにしようとします。あなたのデフォルトのコーデックはasciiですが、実際にはutf-8があるため、128文字以上のバイト値を持つ最初の文字がチョークされます。

戻り値は.decode('utf-8')、そうでない場合はユニコードデータを返すmecabメソッドを使用する必要があります。

+0

うわー、そんなことは考えていませんでした。私は非常に多くのコーデックやデコーディングのデコードをしてきましたが、文字列ではないと思っていました。まあ、私はちょうどすべてのancodingの騒ぎを取り除き、任意のエンコーディングとblamせずに、前のopen関数の最後にwrite()関数を追加しました。できます。 ありがとうございました! – jeffberhow

+0

ああ、絶対にします。私はまだここでは新しいので、私はロープを学んでいます。 :) – jeffberhow

0

ここに動作コードがあります。私のお尻から頭を引き上げるのを手伝ってくれた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) 
関連する問題