Pythonのwith文を理解して活用しよう
プログラム内でファイル操作や通信などを行う場合には、開始時の前処理と終了時の後処理を実行する必要があります。Pythonではこのような場合にwith文を使うと前処理を実行し、ブロック内のメインの処理を終えたあとに自動で後処理を実行してくれます。
with文を使った処理と使わない場合の処理の違いの解説や、ファイル操作を例にしたwith文の具体的な使い方を解説していきます。
Pythonのwith文とは
with文とは前述した通り、ファイル操作や通信などの開始時の前処理と終了時の後処理など必須となる処理を自動で実行してくれるものになります。
ファイル操作を例にすると
- ファイルを開く
- 読み書きをする
- ファイルを閉じる
という処理が必要になりますが、with文を使うことによって3の処理の記述が不要になります。
例として「Hello World」と記述されたtest.txtを読み込む処理を記述します。
test.txt
Hello World
例)with文使用
with open('test.txt', 'r') as file:
print(file.read())
結果:Hello World
with文を使わない場合
with文を使わない場合、上記のファイル操作を例にすると、先程の
- ファイルを開く
- 読み書きをする
- ファイルを閉じる。
これらをすべて記述する必要があります。
例として上記のコードをwith文を使わずに記述します。
例)with文を使用しない場合
file=open('test.txt','r')
text=file.read()
print(text)
file.close()
結果:Hello World
Pythonでwith文を使うメリット
with文を使うメリットを挙げると下記になります。
- コードがシンプルになり可読性のよいスッキリとしたコードになる。
- 後処理を自動で行ってくれるので、ファイルの閉じ忘れ等によるエラーを無くすことができる。
- メモリー開放を意識する必要がない。
Pythonにおけるwith文の使い方
では、with文の基本的な使い方をみていきましょう。
with文は以下のように記述します。(アンダースコアは半角スペースを意味します。)
with_開始処理_as_変数_:
____処理内容
具体的に先ほどのファイル操作を例にして説明します。
with open('test.txt', 'r') as file:
print(file.read())
まずwithを記述し、その後にファイル操作の開始処理であるopen関数を記述します。
open関数の引数として第一引数にファイルパス、第二引数に読み込み(read)を意味する’r’を渡します。
そして開始処理で開いたファイルオブジェクトをasで記述し、変数fileに格納しています。
その後、ファイルオブジェクトであるfileのread関数を使い読み込み処理を行っています。
print文終了後に自動で終了処理(close関数)が行われます。
Pythonでwith文を使ってファイル操作をしてみよう
最後にwith文を使いファイルの作成、追記、読込をしてみましょう。
今回はsample.txtファイルを作成し、その後追記、最後に読み込みを実行します。
まずファイルを開くためのopen関数ですが、第一引数にファイルパス(絶対パスor相対パス)、第二引数に下記のモードのいずれかを記述します。
'r':読込モード。ファイルが存在しない場合はエラーになる。
‘w’:書込モード。ファイルが存在しない場合は新規作成。既存の場合、上書き。
‘a’:追記モード。ファイルが存在しない場合は新規作成。
(第二引数を指定しない場合は読込モードになります)
書込または追記モードを選択した場合にはwrite関数を使用してファイルに書き込むことができます。
(write関数の使い方は、下記コードを参照ください。)
では、実際に記述してみます。
#sample.txtを新規作成し’first_str’を記述
with open('sample.txt','w') as file:
file.write('first_str')
#追記モードで’second_str’を記述
with open('sample.txt','a') as file:
file.write('second_str')
#読込実施
with open('sample.txt','r') as file:
print(file.read())
結果:first_strsecond_str
最初にsample.txtを作成し、write関数を使い’first_str’という文字列を書き込みます。
次に追記モードでwrite関数を使い’second_str’を追記しています。
最後に読込をしprint文を実行しています。ただし、’first_strsecond_str’と最初の文字列の改行されず、そのまま追記されています。
改行追記したい場合は以下のように改行文字「\n」付与して記述します
#抜粋 追記モードで’second_str’を記述
with open('sample.txt','a') as file:
file.write('\nsecond_str')
結果:first_str
second_str
読込にはread関数のほかに、readlines関数というデータを行単位で分割したリストで取得する関数もあります。
#抜粋 読込実施
with open('sample.txt','r') as file:
print(file.readlines())
結果:['first_str\n', 'second_str']
(改行文字「\n」も含まれることに注意)
まとめ
今回はファイル操作を例に説明しましたが、通信など前処理、後処理が必須の処理の際はコードの可読性と安全性を高めるために、with文を活用してみてください。