katuta_games
@katuta_games (gotou katuta)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

python write文のUnicodeErorrによりtxtファイルに文章を書き出せない

解決したいこと

現在、MeCabで形態素解析をした結果をtxtファイルで書き出し行うことを試みているのですが、
ソースのwrite文でUnicodeErorrがでてしまい躓いています。
このUnicodeErorrをどうデバックすればよいか教えていただきたいです。

発生している問題・エラー

C:\Users\phantom\Desktop\形態素解析>python MeCabReader.py EnglishSub.txt
実行中…
Traceback (most recent call last):
  File "MeCabReader.py", line 36, in <module>
    f.write(text.encode('utf-8'))
UnicodeEncodeError: 'utf-8' codec can't encode characters in position 3-6: surrogates not allowed

該当するソースコード

# mecab 大文字小文字に注意
import MeCab
# datetime
import time
# 引数取得
import io , sys

#文字コードをsjisからutf-8に変更する
sys.stdin = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8")
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8')

from sys import argv

import csv

print('実行中…')
# 引数の取得
input_file_name= sys.argv[1]

# 解析対象テキストファイルを開く
f = open(input_file_name,'r',encoding='shift_jis')
# ファイルを読み込む
data = f.read()
# 分かち書きのみ出力する設定にする
mecab = MeCab.Tagger()
text = mecab.parse(data)
mecab.parse('')

#ファイル実行開始時刻を取得
timestr = time.strftime('%Y%m%d-%H%M%S')

#出力ファイル名
out_file_name = "ochasen_" + timestr +  ".txt"
with open(out_file_name, 'w',encoding='utf-8') as f:
    f.write(text.encode('utf-8'))
print('ファイル出力完了 ファイル名:'+ out_file_name)

自分で試したこと

自分自身で試みたことは、
sys.stdで文字コードをあらかじめ指定、またはencodingで文字コードを指定
するなどしました。

しかし、それでもエラーが出てしまい自分自身では解決が困難と
考えた為質問を投稿させて頂きました。

0

1Answer

parse()の次の行に以下の1行を追加してみてください。

text = mecab.parse(data)
text = text.encode('utf-16', 'surrogatepass').decode('utf-16')

また、差し支えなければ、

text = mecab.parse(data)
repr(text)

としてコンソールに表示されるものを見せていただけないでしょうか?

長くなるようでしたら、冒頭の30文字程度で構いません。

textの3-6文字目がサロゲートペアと呼ばれるpythonではutf-8のエンコードができない文字列となっているようですので、それがどんな文字列か気になっている次第です。)

0Like

Comments

  1. @katuta_games

    Questioner

    返答頂いたところ大変申し訳ございません。
    MeCab導入時、UnicodeをShijt_jisでインストールしてしまったのを思い出し
    再度UTF-8で上書きインストールしたらエラーを吐くことなくできました。

    WriteのUnicode指定は余計と考えた為、f.write(text)と訂正しました。
    お騒がせして大変申し訳ございませんでした。
  2. なるほど、MecabがShiftJISでエンコードしてしまっていたのですね

    解決したようで何よりです!;-)

Your answer might help someone💌