日本語ファイルの入力
前回のエントリに書いたとおり、Pythonの内部ではユニコード文字列を使うのがいいようだ。日本語のファイルを読み書きする場合、読み込んだ文字列をユニコードにデコードし、何らかの処理したあと、出力するときに出力先にあわせてエンコードする、という流れになる。
次の例は、シフトJISで書かれた名前のファイルを読み込んで、挨拶をするプログラムだ。
# coding: utf-8 import sys input_file = open(sys.argv[1], "r") for name in input_file: uname = name.decode("sjis").rstrip("\r\n") msg = u"こんにちは、" + uname print msg.encode("sjis")
読み込んだ文字列を10行目でデコードしてユニコード文字列にし、12行目で出力する際にシフトJISにエンコードしている。
実行:
^o^ > type nihongo_sjis.txt アンディ ビル チャーリー ^o^ > python konnichiwa4.py nihongo_sjis.txt こんにちは、アンディ こんにちは、ビル こんにちは、チャーリー
codecsモジュールのopen関数を使うと、ファイルから読み込んだ文字列をデコードする手間が省ける。codecs.open関数には、ファイルのエンコーディングを指定することができる。
# coding: utf-8 import sys import codecs input_file = codecs.open(sys.argv[1], "r", "sjis") for name in input_file: name = name.rstrip("\r\n") msg = u"こんにちは、" + name print msg.encode("sjis")
ファイルをオープンするときにエンコーディングを指定していて、読み込んだ文字列ばデコードしなくてもユニコード文字列になっている。
^o^ > python konnichiwa4a.py nihongo_sjis.txt こんにちは、アンディ こんにちは、ビル こんにちは、チャーリー
日本語のファイル出力
codecs.open関数はファイルに日本語を書き込むときにも使える。
# coding: utf-8 import sys import codecs output_file = codecs.open("nihongo_out_sjis.txt", "w", "sjis") output_file.write(u"こんにちは、世界")
^o^ > python konnichiwa5.py ^o^ > type nihongo_out_sjis.txt こんにちは、世界
Windows のコマンドプロンプトでちゃんと表示されるってことはファイルの中身がシフトJISになってるってことだ。
日本語のファイル名
Pythonでは、ファイル名を扱うほとんどの関数がユニコード文字列に対応している。引数としてユニコード文字列を渡してやれば、あとはプラットフォームにあわせてうまくやってくれる。
# coding: utf-8 import sys import codecs input_file_name = sys.argv[1].decode("sjis") input_file = codecs.open(input_file_name, "r", "sjis") for wday in input_file: wday = wday.rstrip("\r\n") print wday.encode("sjis")
実行結果:
^o^ > type 日本語.txt 月曜日 火曜日 水曜日 木曜日 金曜日 土曜日 日曜日 ^o^ > python nihongo.py 日本語.txt 月曜日 火曜日 水曜日 木曜日 金曜日 土曜日 日曜日