注目キーワード

【Python】fileのopenモード(mode)について(読み・上書き・追記)

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'
sample_open_read_1.pyの実行結果➀

ファイルが存在する場合の挙動

それでは、先ほどの対象ファイルを作成してサンプルソースを実行してみます。対象ファイルの中身は以下のように設定しておきます。

onetwothree

コマンドプロンプトで「type」の後にファイル名を指定すると内容が表示できます。

sample_data.txtの中身を表示

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

sample_open_read_1.pyの実行結果 ②

書き込もうとした場合はどうなるか?

試しに、read modeでopenしたファイルをwriteするとどうなるか試してみましょう。

先ほどのサンプルソースの5行目に「f.write(“test”)」を追加しました。

実行すると以下のようになります。うーん、ちょっと改行がイケていない・・・

ファイルの読み取りと表示の処理は正常に動いていて、5行目でエラーが出ていますね。

サポートされていないオペレーションです。書き込み不可能ですと怒られていますね。

io.UnsupportedOperation: not writable
sample_open_read_2.pyの実行結果

mode「r」のまとめ

ということで、「r」でopenした処理をまとめると以下のようになります。

open mode 対象が存在しない場合読み込み書き込み
r エラー×

read plus modeの場合(r+)

以下のサンプルソースはopen modeを「r+」に設定してあります。この設定だと、書き込みも可能になるそうです。

ファイルが存在しない場合の挙動

まず初めに、ファイルが存在しない場合で動かしてみます。

sample_open_read_plus_1.pyの実行結果➀

先ほどと同じ、「 そんなファイルもフォルダもありませんよ 」というエラーが出力されます。

FileNotFoundError: [Errno 2] No such file or directory: 'sample_data.txt'

ファイルが存在する場合の挙動

ファイルが存在する場合はどうでしょう。

以下のキャプチャはファイルの確認をするためにプログラムを実行する前に「type」を使って対象ファイルの確認を行っています。プログラムのほうも正しく読み取りができていますね。

sample_open_read_plus_1.pyの実行結果②

書き込もうとした場合はどうなるか?

それでは、書き込みはどうでしょうか?

今回は書き込みができていますね、そして書き込まれる文字列はファイルの最後に追加されています。

sample_open_read_plus_2.pyの実行結果

mode「r+」のまとめ

open mode 対象が存在しない場合読み込み書き込み書き込み方法
r+ エラー追記

write modeの場合(w)

次はwrite modeで試してみましょう。以下のサンプルソースの第二引数は「w」になっていますね

ファイルが存在しない場合の挙動

以下が対象ファイルが存在しない場合に実行した結果です。write modeだと対象ファイルが存在しない場合、新しいファイルを作成して書き込んでくれるみたいです。

sample_open_write_1.pyの実行結果

ファイルが存在する場合の挙動

それでは、あらかじめファイルが存在する場合はどのような挙動をするでしょうか、こちらも実際にやってみました。

事前に対象ファイルには以下の内容が書き込まれています。

onetwothree

そして、「 sample_open_write_1.py 」を実行してから対象のファイル「sample_data.txt」を確認すると「test」だけ表示されました。どうやら、write modeでwriteするとファイルの先頭から新規で上書いていくみたいです。

sample_open_write_1.pyの実行結果

読み込もうとした場合はどうなるか?

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

「 サポートされていない操作がされています。読み込み不可です 」とメッセージが出ますね。

スポンサーリンク

sample_open_write_2.pyの実行結果
io.UnsupportedOperation: not readable

mode「w」のまとめ

open mode 対象が存在しない場合読み込み書き込み書き込み方法
w新規作成する×上書き

write plus modeの場合(w+)

この章では、write modeで+を追加するとどのような動きをするか調べてみます。

ファイルが存在しない場合の挙動

ファイルが存在しない場合は、プラスがなくても変わらず、対象のファイルが存在しない場合は新規ファイルを作成します。

sample_open_write_plus_1.pyの実行結果➀

ファイルが存在する場合の挙動

こちらの結果も変わらず、上書きモードでファイルを書きこんでいます。

sample_open_write_plus_1.pyの実行結果②

読み込もうとした場合はどうなるか?

3行目、4行目に読み込みの処理を追加したサンプルソースを作ってみました。

実行結果は以下のようになりました。エラーは起きないけど対象の行が表示されるわけではないみたいです。

sample_open_write_plus_2.pyの実行結果

mode「w+」のまとめ

open mode 対象が存在しない場合読み込み書き込み書き込み方法
w+新規作成する△(エラーにならないが、うまく読み込めず)上書き

append modeの場合(a)

次は追記モードのお話です。

ファイルが存在しない場合の挙動

追記モード(append mode)ですが、対象のファイルが存在しない場合はエラーも発生せず、正常に書き込むことが出来ます。

sample_open_append_1.pyの実行結果➀

ファイルが存在する場合の挙動

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

sample_open_append_1.pyの実行結果②

読み込もうとした場合はどうなるか?

こちらのサンプルソースも、3行目、4行目に読み込みの処理を追加しています。

実際に動かしてみると、やはり「読み込みできません」とエラーが出力されます。

io.UnsupportedOperation: not readable
sample_open_append_2.pyの実行結果

mode「a」のまとめ

open mode 対象が存在しない場合読み込み書き込み書き込み方法
a新規作成する×追記

append plus modeの場合(a+)

次は+(plus)を付けてみるとどうなるか試してみます。

ファイルが存在しない場合の挙動

この結果は+がない時とおなじで、ファイルが存在しない場合は、新しくファイルを作っています。

sample_open_append_plus_1.pyの実行結果➀

ファイルが存在する場合の挙動

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

sample_open_append_plus_1.pyの実行結果②

読み込もうとした場合はどうなるか?

この場合はどうなるでしょうか、実際にサンプルソースを作って動かしてみます。

こちらの場合もwrite plus modeでopenした場合と同じでエラーは発生しないが、 書き込めるという結果になりました。

sample_open_append_plus_2.pyの実行結果

mode「a+」のまとめ

open mode 対象が存在しない場合読み込み書き込み書き込み方法
a+新規作成する △(エラーにならないが、うまく読み込めず)追記

まとめ

今回の検証をまとめた表が以下になります。

open mode 対象が存在しない場合読み込み読み込み方法書き込み書き込み方法
r エラー×
r+エラー追記
w新規作成×上書き
w+新規作成エラーにならないが
うまく読み込めず
上書き
a新規作成×追記
a+新規作成 エラーにならないが
うまく読み込めず
追記

個人的には、「r+」は読み込みも書き込みもできるので便利だが、「w+」と「a+」はエラーにならないだけでうまく読み込めなかったのであんまり使う機会がないとおもいました。

なので、「r」、「r+」、「w」、「a」の4つのopen modeだけ覚えておけば問題なさそうです。

いずれにせよ、「読み込むファイル」と「書き込むファイル」は分けて扱ったほうがよさそうです。