2011-10-25 3 views
2

J'ai écrit une interface graphique qui permet la saisie en japonais et quand vous allez dans le fichier> analyser écrit dans un fichier texte. Ce fichier texte est ensuite exécuté dans MeCab où des espaces sont placés entre les mots. Après cela, il est supposé être à nouveau écrit dans le fichier texte, afin qu'il puisse être affiché dans une autre fenêtre de l'interface graphique.Python 2.7 - comment écrire des informations analysées par MeCab dans un fichier texte?

Le problème que je rencontre est qu'il ne veut pas écrire les données analysées dans le fichier texte. Il n'a aucun problème à l'écrire la première fois. En outre, il imprime les informations analysées à IDLE sans problème. Voici l'analyseur et l'erreur:

#!/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

Que signifie exactement 'mecab.parse()'? Comme dans, que obtenez-vous si vous tapez 'mecab.parse (read_from)' à l'invite de commande? –

+0

La fonction d'analyse analyse la façon dont la fonction Tagger lui demande d'analyser. C'est comme ça que je le comprends. – jeffberhow

+0

Désolé, je ne comprends pas comment commenter avec les sauts de page. Ce serait une analyse d'une ligne qui séparerait le test par des espaces: print MeCab.Tagger ('- Owakati') .parse ('testtesttest') – jeffberhow

Répondre

4

Les données analysées n'est pas unicode, c'est une chaîne d'octets.

Ainsi, lorsque vous essayez d'écrire les données dans le fichier, il essaie de decode à UNICODE avant encodage à utf-8. Puisque votre codec par défaut est ascii, mais que vous avez effectivement utf-8, il s'interrompt sur le premier caractère avec une valeur de 128 ou plus.

Vous devez .decode('utf-8') renvoyer les données, ou utiliser une méthode mecab qui renvoie des données Unicode.

+0

Wow, je n'y ai pas pensé comme ça. J'ai joué avec tant de codecs et de décodage d'encodage, je ne pensais pas juste à une chaîne. Eh bien, je viens de me débarrasser de tout le battement d'ancre et ajouté la fonction write() à la fin de la fonction ouverte précédente, sans aucun encodage et blam. Ça marche. Merci beaucoup! – jeffberhow

+0

Ah, va absolument faire. Je suis encore nouveau ici, donc j'apprends les ficelles du métier. :) – jeffberhow

0

Voici le code fonctionnel. Merci à agf pour m'avoir aidé à sortir la tête de mes fesses.

#!/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) 
Questions connexes