Pythonのopenのmodeは様々な指定方法が存在します。読み込み(read)、書き込み(write)、追記(append)とかそのほか+(プラス)をつけると読み書き両方できるようになったりするようです。
少し気になったのでサンプルソースを使いながらどのような動きをするか一つずつまとめていきたいと思います。
この記事では、file openのmodeで「r」、「r+」、「w」、「w+」、「a」、「a+」の6種類のmodeについてまとめていきたいと思います。
今回の記事は長いので、サクッと結論だけ知りたい人はまとめへ飛んでください。表にまとめてあります。
対象レベル
Pythonの環境設定が整っており、Pythonの基本構文が理解出来ること。
詳しくは「【Python入門】〜初級編〜環境構築・基本構文まとめ」にまとめてあります。興味のある方はご覧ください。
サンプルソースを読むうえで理解しておきたいこと
基本的にこの章の内容は読み飛ばしてOKです。サンプルソースでわからないところがあれば参照してみてください。
with open構文
ファイルを1行づつ読み込む方法
工事中
read modeの場合(r)
ファイルが存在しない場合の挙動
それでは、read modeで対象ファイルが存在しない場合にどのような挙動を取るか見てみましょう。サンプルソースは以下のとなります。この場合、対象ファイルは「sample_data.txt」です。
「sample_data.txt」が存在しない状態でプログラムを実行してみます。
そうすると以下のようなエラーが出力されます。中身を見ると「No such file or directory」と出力されていますね、要はそんなファイルまたはフォルダは存在しませんよと怒られています。
FileNotFoundError: [Errno 2] No such file or directory: 'sample_data.txt'

ファイルが存在する場合の挙動
それでは、先ほどの対象ファイルを作成してサンプルソースを実行してみます。対象ファイルの中身は以下のように設定しておきます。
onetwothree
コマンドプロンプトで「type」の後にファイル名を指定すると内容が表示できます。

今回は対象のファイルが存在するのでopenでエラーが発生せずに中身が表示されていますね。

書き込もうとした場合はどうなるか?
試しに、read modeでopenしたファイルをwriteするとどうなるか試してみましょう。
先ほどのサンプルソースの5行目に「f.write(“test”)」を追加しました。
実行すると以下のようになります。うーん、ちょっと改行がイケていない・・・
ファイルの読み取りと表示の処理は正常に動いていて、5行目でエラーが出ていますね。
サポートされていないオペレーションです。書き込み不可能ですと怒られていますね。
io.UnsupportedOperation: not writable

mode「r」のまとめ
ということで、「r」でopenした処理をまとめると以下のようになります。
open mode | 対象が存在しない場合 | 読み込み | 書き込み |
r | エラー | 〇 | × |
read plus modeの場合(r+)
以下のサンプルソースはopen modeを「r+」に設定してあります。この設定だと、書き込みも可能になるそうです。
ファイルが存在しない場合の挙動
まず初めに、ファイルが存在しない場合で動かしてみます。

先ほどと同じ、「 そんなファイルもフォルダもありませんよ 」というエラーが出力されます。
FileNotFoundError: [Errno 2] No such file or directory: 'sample_data.txt'
ファイルが存在する場合の挙動
ファイルが存在する場合はどうでしょう。
以下のキャプチャはファイルの確認をするためにプログラムを実行する前に「type」を使って対象ファイルの確認を行っています。プログラムのほうも正しく読み取りができていますね。

書き込もうとした場合はどうなるか?
それでは、書き込みはどうでしょうか?
今回は書き込みができていますね、そして書き込まれる文字列はファイルの最後に追加されています。

mode「r+」のまとめ
open mode | 対象が存在しない場合 | 読み込み | 書き込み | 書き込み方法 |
r+ | エラー | 〇 | 〇 | 追記 |
write modeの場合(w)
次はwrite modeで試してみましょう。以下のサンプルソースの第二引数は「w」になっていますね
ファイルが存在しない場合の挙動
以下が対象ファイルが存在しない場合に実行した結果です。write modeだと対象ファイルが存在しない場合、新しいファイルを作成して書き込んでくれるみたいです。

ファイルが存在する場合の挙動
それでは、あらかじめファイルが存在する場合はどのような挙動をするでしょうか、こちらも実際にやってみました。
事前に対象ファイルには以下の内容が書き込まれています。
onetwothree
そして、「 sample_open_write_1.py 」を実行してから対象のファイル「sample_data.txt」を確認すると「test」だけ表示されました。どうやら、write modeでwriteするとファイルの先頭から新規で上書いていくみたいです。

読み込もうとした場合はどうなるか?
結論から言うと以下のサンプルは途中でエラーがになります。また、writeモードの動きのイメージは新規のテキストを開いて内容を書き込んで指定した名前で上書き保存するようなイメージなので読み込む意味ってなさそうなんですけどね。
「 サポートされていない操作がされています。読み込み不可です 」とメッセージが出ますね。
スポンサーリンク

io.UnsupportedOperation: not readable
mode「w」のまとめ
open mode | 対象が存在しない場合 | 読み込み | 書き込み | 書き込み方法 |
w | 新規作成する | × | 〇 | 上書き |
write plus modeの場合(w+)
この章では、write modeで+を追加するとどのような動きをするか調べてみます。
ファイルが存在しない場合の挙動
ファイルが存在しない場合は、プラスがなくても変わらず、対象のファイルが存在しない場合は新規ファイルを作成します。

ファイルが存在する場合の挙動
こちらの結果も変わらず、上書きモードでファイルを書きこんでいます。

読み込もうとした場合はどうなるか?
3行目、4行目に読み込みの処理を追加したサンプルソースを作ってみました。
実行結果は以下のようになりました。エラーは起きないけど対象の行が表示されるわけではないみたいです。

mode「w+」のまとめ
open mode | 対象が存在しない場合 | 読み込み | 書き込み | 書き込み方法 |
w+ | 新規作成する | △(エラーにならないが、うまく読み込めず) | 〇 | 上書き |
append modeの場合(a)
次は追記モードのお話です。
ファイルが存在しない場合の挙動
追記モード(append mode)ですが、対象のファイルが存在しない場合はエラーも発生せず、正常に書き込むことが出来ます。

ファイルが存在する場合の挙動
この場合は改行のタイミングがイケてませんが、ファイルの末尾にwriteした文字列が書き込まれています。

読み込もうとした場合はどうなるか?
こちらのサンプルソースも、3行目、4行目に読み込みの処理を追加しています。
実際に動かしてみると、やはり「読み込みできません」とエラーが出力されます。
io.UnsupportedOperation: not readable

mode「a」のまとめ
open mode | 対象が存在しない場合 | 読み込み | 書き込み | 書き込み方法 |
a | 新規作成する | × | 〇 | 追記 |
append plus modeの場合(a+)
次は+(plus)を付けてみるとどうなるか試してみます。
ファイルが存在しない場合の挙動
この結果は+がない時とおなじで、ファイルが存在しない場合は、新しくファイルを作っています。

ファイルが存在する場合の挙動
ファイルが存在する場合も先ほどと同じで、ファイルの末尾に追記されます。

読み込もうとした場合はどうなるか?
この場合はどうなるでしょうか、実際にサンプルソースを作って動かしてみます。
こちらの場合もwrite plus modeでopenした場合と同じでエラーは発生しないが、 書き込めるという結果になりました。

mode「a+」のまとめ
open mode | 対象が存在しない場合 | 読み込み | 書き込み | 書き込み方法 |
a+ | 新規作成する | △(エラーにならないが、うまく読み込めず) | 〇 | 追記 |
まとめ
今回の検証をまとめた表が以下になります。
open mode | 対象が存在しない場合 | 読み込み | 読み込み方法 | 書き込み | 書き込み方法 |
r | エラー | 〇 | × | – | |
r+ | エラー | 〇 | 〇 | 追記 | |
w | 新規作成 | × | – | 〇 | 上書き |
w+ | 新規作成 | △ | エラーにならないが うまく読み込めず | 〇 | 上書き |
a | 新規作成 | × | – | 〇 | 追記 |
a+ | 新規作成 | △ | エラーにならないが うまく読み込めず | 〇 | 追記 |
個人的には、「r+」は読み込みも書き込みもできるので便利だが、「w+」と「a+」はエラーにならないだけでうまく読み込めなかったのであんまり使う機会がないとおもいました。
なので、「r」、「r+」、「w」、「a」の4つのopen modeだけ覚えておけば問題なさそうです。
いずれにせよ、「読み込むファイル」と「書き込むファイル」は分けて扱ったほうがよさそうです。