Pythonでファイル読み込み・書き込みをする方法を解説【コピペOK】

python-read-and-write-files

ファイル操作は基本的な処理のひとつですが、長く触っていないと忘れてしまいますよね。この記事では、読み込み・書き込みといったファイル操作をPythonで行う方法を紹介します。

この記事のまとめ

コピペでサクッと使いたい人は以下を参考にしてみてください。

with open("/path/to/file", mode="r") as f:
    s = f.read()

with open("/path/to/file" mode="w") as f:
    f.write(s)

コードの詳細や解説が気になる方は続きもどうぞ。read関数以外の読み込み方法なども紹介しています。

Pythonのファイル操作のやり方

全体的な流れとしては、

  1. with構文とopenでファイルを開く
  2. ファイル操作を行う(read, writeなど)

といった順で処理を記述することになります。プログラミングに慣れている人であれば「openしたなら最後にcloseもするべきなのでは?」と思うかもしれませんが、with構文を利用することでブロックを抜ける際に勝手にcloseしてくれるので安心してください。

ファイルを開く(with, open)

読み込みモードでファイルを開く

with構文を利用して以下のように記述することでファイルを開くことが出来ます。”/path/to/file”には開きたいファイルのパスを指定してください。

with open("/path/to/file", mode="r") as f:
    pass

ここで、mode=”r”は読み込みモードでファイルを開くことを示しています。readの頭文字のrです。modeのデフォルト値は”r”なので、何も指定しなければ読み込みモードになります。

このように記述すると、withブロックの中(passの部分)でfを介してファイル操作を行うことが出来るようになります。そのため、ファイルの中身を文字列として読み込んだりする処理はwithブロック内に記述することになります。文字列読み込みの方法は後述します。

書き込みモードでファイルを開く

書き込みモードの場合は、読み込み時と同じように以下のコードで開くことができます。

with open("/path/to/file", mode="w") as f:
    pass

変わった場所は、openの引数のmodeが”w”になったというところだけです。これは、書き込みモードでファイルを開くという指定になります。writeの頭文字のwです。

エンコーディングの指定方法

open関数の引数でエンコーディング方法を指定することができます。UTF-8でファイルを開くには以下のように指定すれば良いです。

with open("/path/to/file", mode="r", encoding="utf-8") as f:
    pass

encoding引数のデフォルト値はNoneになっており、プラットフォームに依存してエンコーディングが変わります。環境に依存させるのが嫌な場合は、何らかの値を指定しておきましょう。

読み込み・書き込み

ファイルの中身を読み込む

ファイルの中身を文字列として読み込むにはいくつかの方法があります。一番単純なのはread関数です。

with open("/path/to/file", mode="r") as f:
    s = f.read()

read関数はファイルの中身全てを文字列として返します。ファイルの中身が極端に大きくない場合などはこれを使っておくと良いと思います。

一行だけ読み込みたい場合には、readline関数を使用します。readline関数は複数回呼び出すことで次の行の値を読み込むことができます。

with open("/path/to/file", mode="r") as f:
    s_1 = f.readline() # 1行目
    s_2 = f.readline() # 2行目

ファイルの一番最後では空文字が返ってきます。

一行ごとに全行読み込みたい場合には、readlines関数を利用すると良いです。readlines関数はファイルの中身を行ごとにひとつの文字列として読み込み、文字列のリストとして全行を返します。

with open("/path/to/file", mode="r") as f:
    s_list = f.readlines()

ファイルに文字列を書き込む

ファイルに文字列を書き込む場合にはwrite関数を利用します。書き込みたい文字列を引数に与えるだけで書き込みを行うことができます。

with open("/path/to/file", mode="w") as f:
    f.write("foo")