大変悲しいお知らせです。

Pythonはやっぱり日本語に弱い。
今日それがわかり申した。
日本語をバリバリ扱おうと思うとやはり不利だな、こいつは。


http://python.matrix.jp/tips/string/encoding.html
でも、ここらあたりを読むと何とかなりそうな予感。
ファイルからひらがなを読み込み、DOS窓に表示、ファイルに書き出す作業。
これC言語とかならそんなに難しくなかった気がするが、Pythonではめちゃくちゃめんどくさい。


いろいろ調べてみても、スクリプトファイル内で日本語を扱っているものは多々あるが、ファイル関連になるととんと資料がなくなる。
で、どうやらcodecsモジュールというものを使って、ファイルオブジェクトをラップしてあげるとよろしそう。

# -*- encoding : utf-8 -*-

import codecs

f = open("text.txt", "r")
decorded_f = codecs.getreader("utf-8")(f)
st = decorded_f.readlines()
print st
print st[0].encode("mbcs")
f.close()

f = open("text2.txt", "w")
encoded_f = codecs.getwriter("utf-8")(f)
for line in st:
    encoded_f.write(line)
f.close()

結果

D:\workspace\Python\3-11>python test.py
[u'\ufeff\u3042\u3044\u3046\u3048\u304a\n', u'\u304b\u304d\u304f\u3051\u3053\n',
 u'\u3055\u3057\u3059\u305b\u305d\n', u'\u305f\u3061\u3064\u3066\u3068\n', u'\u3
06a']
?あいうえお

text2.txt

あいうえお
かきくけこ
さしすせそ
たちつてと
な

となる。
ちなみに読み出し側のファイルはあらかじめUTF-8エンコードしておいた。


わかったこと

  • ファイルの先頭に変なものがつく(何だろう??)
  • DOS窓への表示はmbcsにエンコードする必要がある。
  • 書き出したファイルはバイナリファイル扱いになってしまう。(lessで確認)


ん〜、難しい。誰か詳しい人がいたら、まとまった情報源をおしえてくだしゃぁ。
パニック。

ちなみに

いつものようにファイルオブジェクトを操作して読み出し書き出しをしようとすると…

# -*- encoding : utf-8 -*-

import codecs

f = open("text.txt", "r")
st = f.readlines()
print st
print st2[0].encode("mbcs")
f.close()
D:\workspace\Python\3-11>python test.py
['\xef\xbb\xbf\xe3\x81\x82\xe3\x81\x84\xe3\x81\x86\xe3\x81\x88\xe3\x81\x8a']
Traceback (most recent call last):
  File "test.py", line 15, in ?
    print st2[0].encode("mbcs")
UnicodeDecodeError: 'ascii' codec can't decode byte 0xef in position 0: ordinal
not in range(128)

終了。

ちなみに2

上記の方法でカタカナ漢字も対応しておりました。