ゼロからPythonを学んでいく本連載、今回は、Pythonを使ってファイルを読み書きする方法を解説する。そもそもファイルシステムは、OSの基本的な機能の一つだ。Pythonからファイルを扱うには、ファイルを開き、読み書きし、閉じるという手順に沿う必要がある。今回は、特に、日本語のテキストファイルを読み書きする方法を考慮しよう。
Pythonでファイルを読み書きする手順
結論から言って、Pythonでファイルを読み書きするには、以下の手順に沿って処理を記述する必要がある。
- 1. open関数でファイルを開く
- 2. ファイルを読み書きする
- 3. close()メソッドでファイルを閉じる
このように、ファイルを開き、読み書きしたら、ファイルを閉じる。これが、Pythonのファイル操作の基本だ。それでは、実際のプログラムで確認してみよう。
実際にテキストファイルを読み書きするプログラム
まずは、テキストファイルを作成し、適当な文章を書き込んでみましょう。今回も、Jupyterノートブックを起動し、そこで、プログラムを実行しながら、学んでいこう。
以下が、ファイル「kakugen.txt」に格言を書き込むプログラムだ。
# ファイルに格言を書き込む
fw = open("kakugen.txt", "wt")
fw.write("光陰矢のごとし")
fw.close()
コメントを除いた一行目から見ていこう。open関数は、第一引数が、ファイルパスであり、第二引数がオプションとなっている。テキストファイルを書き込む場合には、このオプションに"wt"と指定する。"w"はファイルの書き込みを行うことを指定し、"t"はテキストファイルであることを指定する。
そして、open関数でファイルを開くと、戻り値として、ファイル操作のためのオブジェクトが得られる。オブジェクトというのは、対象となるデータとそれを操作する機能を持っているモノと考えると良い。つまり、ここでは、ファイルを操作するためのオブジェクトが得られる。
二行目は、ファイルへテキストを書き込む。書き込みを行うには、open関数で得たオブジェクトが提供するwriteメソッドを利用する。Pythonでは『オブジェクト.メソッド()』のように書いて、オブジェクトが持つ機能を利用できる。それで、『fw.write("テキスト")』のように記述することで、対象となるファイルにテキストを書き込むことができる。そして、最後、三行目では、closeメソッドを呼び出して、ファイルを閉じるように指示している。
続いて、書き込んだファイルを読み込んでみよう。以下がテキストファイルを読み込むプログラムだ。
# ファイルから格言を読み込む
fr = open("kakugen.txt", "rt")
text = fr.read() # テキストを読み出す --- (*1)
print(text)
fr.close()
このプログラムは、先ほどの書き込みプログラムを実行した後で、実行しよう。すると、「kakugen.txt」の内容を読み出し「光陰矢のごとし」と表示されるはずだ。ここまでの作業を、Jupyterノートブックで実行すると、次のようになる。
プログラムを見てみよう。先ほどのプログラムとほとんど同じなので、異なる部分だけ見てみよう。それは、ファイルからテキストを読み出している(※1)の部分だ。このようにreadメソッドを呼びだすと、ファイルの中の全部のテキストを読み出すことができる。
エラーが出ても怖くない
ところで、大抵の方は、ここまでのプログラムが正しく動いたことだろう。しかし、運悪く以下のようなエラーが出ることがある。
PermissionError: [Errno 13] Permission denied: 'kakugen.txt'
あまりプログラミングに慣れていない人の場合、エラーが出ると、それをとても恐ろしく感じるものだ。しかし、エラーへの対処はプログラムを作る上で欠かせないものだ。
そもそも、エラーが起きる原因は、大きく分けて二つ。一つは、プログラムが間違っているケース。そして、もう一つは、プログラムは合っているものの、プログラムを実行した時の状態が悪かったために起きるケースだ。
前者のケース(プログラムが間違っているもの)は、プログラムを直せば動く。しかし、後者のケースでは、プログラムには問題がないので、プログラム以外の要因を調査する必要がある。この手のエラーが、なぜ起きるのかというと、ネットワークが切断されていたり、ディスクが一杯で書き込みができない状態であったり、といった外的な要因でエラーとなる。
今回出たエラーは、「Permission denied」だ。Pythonのエラーメッセージは基本的に英語で表示されるので驚くが、いずれも難しいものではない。permissionとは許可で、deniedとは否定する(deny)の過去形だ。つまり、アクセス権限がないというエラーということになる。
言い換えるなら、ファイルもしくはディレクトリが「読み取り専用」に設定されているということだ。Windowsであれば、フォルダのプロパティで、読み取り専用属性をはずそう。macOSやLinuxであれば、「chmod u+w (ファイルやフォルダのパス)」のコマンドを実行して書き込み権限を付与しよう。
日本語のテキストファイルを読み込もう
ところで、上記の手順で、Pythonで書き込んだ日本語のテキストを、テキストエディタで開いてみると分かるが、文字エンコーディング(いわゆる文字コード)は、環境によって異なる。
昨今、大抵のテキストエディタは、UTF-8を読み書きできようになっているが、何かしらの理由で、異なる環境で読み書きしたい場合もある。そんな時は、open関数を呼ぶときに、encoding="shift_jis"のようにパラメータを追加しよう。以下は、Shift_JISでファイルを読み書きするプログラム例だ。
# ファイルにShift_JISで格言を書き込む
fw = open("kakugen-sjis.txt", "wt", encoding="shift_jis")
fw.write("光陰矢のごとし")
fw.close()
# ファイルから格言を読み込む
fr = open("kakugen-sjis.txt", "rt", encoding="shift_jis")
text = fr.read()
print(text)
fr.close()
プログラムを実行したら、念のため、テキストエディタで書き出された「kakugen-sjis.txt」を開いて、文字コードを確認してみよう。Shift_JISと認識されているはずだ。先ほどのプログラムと異なる部分は、open関数で、encoding="shift_jis"のパラメータを追加しているだけだ。UTF-8の場合は、同様にencoding="utf-8"とすればよい。
まとめ
以上、今回は、Pythonでテキストファイルを読み書きする方法を紹介した。ファイルを開いて、処理をしたら、閉じるという一連の手順に沿ってプログラムを作る必要があることを紹介した。安全にファイルを扱うために、この手順が必要なので、覚えておこう。次回は、もう少し、実践的にファイルを扱う方法を紹介する。
自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2004年度未踏ユース スーパークリエータ、2010年 OSS貢献者章受賞。技術書も多く執筆している。