注目キーワード

【Python】with open構文の使い方について

ネット上でPythonのファイル操作の方法を調べていると「open with」という構文が良く出てきたのでまとめてみました。

この 「with open」 構文のメリットとして可読性が上がることと「close」をする必要がない?とのことなのでサンプルプログラムを作って動かしてみました。

対象レベル

Pythonの環境設定が整っており、Pythonの基本構文が理解出来ること。

詳しくは「【Python入門】〜初級編〜環境構築・基本構文まとめ」にまとめてあります。興味のある方はご覧ください。

ファイル操作について

基本的なファイルの開き方

まずは、基本的なファイルの操作方法について説明していきます。

下のテキストファイルが今回読み込む対象のファイルとなります。このファイルは実行するプログラムです。と同じ階層に配置しておきます。

以下のサンプルソースは「sample_data.txt」を読み込みモードで開いて(2行目)、ファイルの中身を表示(3行目)するプログラムです。

どの言語を使うときもファイル操作は「open」したら「close」をします。おまじないだと思っておいてください。

実行結果は以下の通りで、「 sample_data.txt 」の内容を出力しています。

sample_open_1.pyの実行結果

同じファイルを2回開く場合(よい例)

良い例とはいっても、

実装するときに、このような実装には絶対しないとは思いますが、、、

以下のサンプルプログラムでは、2行目、3行目で「 sample_data.txt 」を一旦開いて閉じます(特に意味はありません)

5行目〜7行目で再度「 sample_data.txt 」を開きなおして標準出力に出力します。

実行結果は先ほどと同じです。

sample_open_2.pyの実行結果

同じファイルを2回開く場合(よくない例) close忘れ

先ほどのサンプルソースから「close」処理を削除しました。

個人的にはcloseしていないファイルにアクセスするわけなのでエラーになるのかと思っていましたが、

どうやらエラーになりませんでした。ファイルのモードを変えて試してみましたがそれでもエラーは発生しませんでした。

sample_open_2_bad.pyの実行結果

with open構文の使い方

ここからが本番で、「with open」構文の使い方について説明します。

以下のような感じで「with」の後に「open」でファイルを引きます。「別名.read()」でファイルの内容を読み込みます。動かしてみて気が付いたことは「read()」は一括ですべての行を取得しています。

スポンサーリンク

なので、一行一行処理する必要がある場合は「工事中」を参考に実装してみてください。

with open(対象ファイル, モード) as 別名:  インデントを下げて処理を実装  読み込むときは「別名.read()」
sample_open_with.pyの実行結果

まとめ

「close」なして同じファイルにアクセスできたため、実は「close」は不要?

それにしても可読性はあがるので「with open」を使ったほうがよさそう

「with open」構文の使い方は、 「with open(対象ファイル, モード) as 別名:」でインデントを下げて処理を書く