日本語とファイル入出力

日本語ファイルの入力

前回のエントリに書いたとおり、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
月曜日
火曜日
水曜日
木曜日
金曜日
土曜日
日曜日

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください