この記事で分かること
- Pythonのwithとasを使う用途が分かる
- withとasを使う場合の注意点とその改良方法が分かる
Pythonのwithとas使い方概要
この記事では、withとasの使い方をサンプルプログラムを使って説明します。
「with」と「as」を使うことで、限らてた範囲での変数の使用や、クローズ処理などの「後処理」が必要な変数を扱った場合に、ヘンスの使用範囲を明確にし、「後処理」自体を省略することができます。
例えば、ファイルを一旦オープンしてしまうと、使い終わった後には、必ずクローズ処理しなければならないですが、この「with」を使うと、「ファイルを引いている間」という「with」のスコープで考えることができます。もし、withのスコープを抜けると自動でファイルをクローズしてくれ、クローズ処理を省略することができます。
Pythonのwithとas使い方前提環境
Pythonのwithとasの使い方の環境は、下の記事で説明している私の環境と同じ環境で確認しています。
また、レンタルサーバなどのLinuxサーバを使っている場合は、下の記事でプログラミングする環境の作り方を説明しています。
もし、まだプログラムする環境ができていない方は、先にこちらの記事を読んで、プログラミングできる環境をつくることをおすすめします。
Pythonのwithとasの使い方サンプルプログラム
ここでは、テキストファイルを1行ずつ読み出すサンプルプログラムを使って、「with」と「as」の使い方を説明します。
テキストファイルを1行ずつ読み出すサンプルプログラムを作成する為には、読み出す文字が書かれたテキストファイルを準備しなくてはなりません。そのテキストファイルを準備を始めとして、次の順番で「with」と「as」の使い方を説明します。
- サンプルのテキストファイルの準備
- withとasを使わない場合のプログラム
- withとasを使う場合のプログラム
- withとasを使う場合のプログラム(改良版)
1.サンプルのテキストファイルの準備
まず、サンプルプログラムで使う為のテキストファイルを準備します。
下のように、このテキストファイルの中身は、test1からtest10までの文字列が10行に渡って書かれているテキストファイルとしました。このテキストファイルの名前を「test.txt」とします。
test1
test2
test3
test4
test5
test6
test7
test8
test9
test10
2.withとasを使わない場合のプログラム
「with」と「as」を使う場合と使わない場合を比較することで、「with」と「as」の使い方や効果を説明する為に、先ほど作成したテキストファイル「test.txt」を1行ずつ読み込んで、表示させるプログラムを書きます。
withとasを使わない場合のプログラムの作成
今回は、「open」関数によってファイルオブジェクトを生成し、ファイルオブジェクトの「readlines」関数を呼び出すことによって、1行毎の文字列を1要素として、ファイル行数要素分の長さのリストが返却されます。そのリストの要素分だけfor文を回し、1行の文字列を繰り返し表示しています。
if __name__ == '__main__':
file = open('./test.txt','r')
lines = file.readlines()
for line in lines:
print(line)
file.close()
- テキストファイル「test.txt」を読み取りモードで開き、ファイルを扱う変数「file」を定義する。
- 文字列行を変数「lines」に配列として格納する。
- 文字列の行の回数だけfor文で繰り返し、文字列「line」を表示する。
- ファイルを扱う変数「file」を閉じる。
withとasを使わない場合のプログラムの実行結果
先程のプログラムの実行結果は、次のようになりました。テキストファイル「test.txt」の「test1」から「test10」までの10行を正しく表示できていることが分かります。
$ python test.py
test1
test2
test3
test4
test5
test6
test7
test8
test9
test10
3.withとasを使う場合のプログラム
次に、with構文を用いて、テキストファイル「test.txt」の中身を表示するプログラムを考えます。
withとasを使う場合のプログラムの作成
下のプログラムのように、前のプログラムでは個別にオープンした行がなくなり、with構文の中で、ファイルをオープンしています。次のwith構文では、test.txtをopenしたファイルオブジェクトを渡し、そのファイルオブジェクトの名前をfileとする という意味になります。さらに前のプログラムでは、ファイルをクローズする処理が必要でしたが、今回のwith構文を使った場合には省略することができました。
if __name__ == '__main__':
with open('./test.txt','r') as file:
lines = file.readlines()
for line in lines:
print(line)
- 「test.txt」のファイルを読み取りモードで開き、ファイルを扱う変数「file」を定義する。
- 文字列行を変数「lines」に配列として格納する。
- 文字列の行の回数だけfor文で繰り返し、文字列「line」を表示する。
withとasを使う場合のプログラムの実行結果
処理結果は次のようになりました。先ほどと同様にテキストファイル「test.txt」の「test1」から「test10」までの10行を正しく表示できていることが分かります。1行毎に表示行が1行飛びになっているのが気になりますね。「test.txt」から取得した1行の文字列の末尾に改行コードがあり、print文で更に改行されるので、このような1行飛びの表示担っていると考えられます。
これを改良したプログラムを次に説明します。
$ python test.py
test1
test2
test3
test4
test5
test6
test7
test8
test9
test10
4.withとasを使う場合のプログラム(改良版)
ここでは、先ほどの結果の1行飛びになっている表示を修正するプログラムを考えます。
withとasを使う場合のプログラムの作成(改良版)
for文の中で「test.txt」から取得した1行の文字列の末尾にある改行コードをstrip()関数によって削除してみました。
if __name__ == '__main__':
with open('./test.txt','r') as file:
lines = file.readlines()
for line in lines:
print(line.strip())
- 「test.txt」のファイルを読み取りモードで開き、ファイルを扱う変数「file」を定義する。
- 文字列行を変数「lines」に配列として格納する。
- 文字列の行の回数だけfor文で繰り返し、「strip()」関数で文字列の末尾の改行コードを削除し文字列「line」を表示する。
withとasを使う場合のプログラムの実行結果(改良版)
次の結果のように、1行飛びになっていた表示が連続した行の表示に修正されています。
$ python test.py
test1
test2
test3
test4
test5
test6
test7
test8
test9
test10