れロから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関数でファむルを開くず、戻り倀ずしお、ファむル操䜜のためのオブゞェクトが埗られる。オブゞェクトずいうのは、察象ずなるデヌタずそれを操䜜する機胜を持っおいるモノず考えるず良い。぀たり、ここでは、ファむルを操䜜するためのオブゞェクトが埗られる。

䜜成されたkakugen.txt

二行目は、ファむルぞテキストを曞き蟌む。曞き蟌みを行うには、open関数で埗たオブゞェクトが提䟛するwriteメ゜ッドを利甚する。Pythonでは『オブゞェクト.メ゜ッド()』のように曞いお、オブゞェクトが持぀機胜を利甚できる。それで、『fw.write("テキスト")』のように蚘述するこずで、察象ずなるファむルにテキストを曞き蟌むこずができる。そしお、最埌、䞉行目では、closeメ゜ッドを呌び出しお、ファむルを閉じるように指瀺しおいる。

続いお、曞き蟌んだファむルを読み蟌んでみよう。以䞋がテキストファむルを読み蟌むプログラムだ。

 # ファむルから栌蚀を読み蟌む
 fr = open("kakugen.txt", "rt")
 text = fr.read() # テキストを読み出す --- (*1)
 print(text)
 fr.close()

このプログラムは、先ほどの曞き蟌みプログラムを実行した埌で、実行しよう。するず、「kakugen.txt」の内容を読み出し「光陰矢のごずし」ず衚瀺されるはずだ。ここたでの䜜業を、Jupyterノヌトブックで実行するず、次のようになる。

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貢献者章受賞。技術曞も倚く執筆しおいる。