python

【python】withとasの使い方【→プログラミング初心者向け】

2月 14, 2020

how to use "as" and "with" in python
プログラム女子
pythonのプログラムで、「as」と「with」ってネットでみたことあるんだけど、どうやって使うんですか?
if文やforループの時によく使われているね。asとwithは変数の使用範囲を明確にするために使うんだ。例えば、forループの処理の間だけ使いたい変数などは、asとwithを使うことが多いんだ。これらを例を挙げて説明するね。
Tommy

pythonのwithとasの使い方の概要

summary of using with and as

この記事では、withとasの使い方をサンプルプログラムを使って説明します。

withとasを使うことで、限らてた範囲での変数の使用や、クローズ処理などの「後処理」が必要な変数を扱った場合に、ヘンスの使用範囲を明確にし、「後処理」自体を省略することができます。

例えば、ファイルを一旦オープンしてしまうと、使い終わった後には、必ずクローズ処理しなければならないですが、このwithを使うと、withで「ファイルを引いている間」という具体に、withのスコープで考えることができます。

もし、withのスコープを抜けると自動でクローズしてくれ、クローズ処理を省略することができます。

pythonのwithとasの使い方の前提の環境

environment of using with and as

pythonのwithとasの使い方の環境は、下の記事で説明している私の環境と同じ環境で確認しています。

また、レンタルサーバなどのLinuxサーバを使っている場合は、下の記事でプログラミングする環境の作り方を説明しています。

オススメ
how to check version in python
【python】バージョン確認の方法【→プログラミング初心者向け】

続きを見る

もし、まだプログラムする環境ができていない方は、先にこちらの記事を読んで、プログラミングできる環境をつくることをおすすめします。

オススメ
how to programming on rental server
レンタルサーバでプログラミングする方法【→ブログのサーバでできる!】

続きを見る

pythonのwithとasの使い方のサンプルプログラム

sample program of using with and as

ここでは、テキストファイルを1行ずつ読み出すサンプルプログラムで、withとasの使い方を説明します。

サンプルのテキストファイルを準備する

まず、サンプルプログラムで使う為のテキストファイルを準備します。

下のように、このテキストファイルの中身は、test1からtest10までの文字列が10行に渡って書かれているテキストファイルとしました。

このテキストファイルの名前はtest.txtとします。

test1
test2
test3
test4
test5
test6
test7
test8
test9
test10

withとasを使わない場合のプログラム

次に、先ほど作成したテキストファイルtest.txtを1行ずつ読み込んで、表示させるプログラムを書きます。

今回は、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()

withとasを使わない場合のプログラムの実行結果

先程のプログラムの実行結果は、次のようになりました。

テキストファイルtest.txtの「test1」から「test10」までの10行を正しく表示できていることが分かります。

$ python test.py
test1

test2

test3

test4

test5

test6

test7

test8

test9

test10

withとasを使う場合のプログラム

次に、with構文を用いて、テキストファイルtest.txtの中身を表示するプログラムを考えます。

下のプログラムのように、前のプログラムでは個別にオープンした行がなくなり、with構文の中で、ファイルをオープンしています。

次のwith構文では、test.txtopenしたファイルオブジェクトを渡し、そのファイルオブジェクトの名前をfileとする という意味になります。

さらに前のプログラムでは、ファイルをクローズする処理が必要でしたが、今回のwith構文を使った場合には省略することができました。

if __name__ == '__main__':

with open('./test.txt','r') as file:

lines = file.readlines()
for line in lines:
print(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

withとasを使う場合のプログラム(改良版)

ここでは、先ほどの結果の1行飛びになっている表示を修正するプログラムを考えます。

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())

withとasを使う場合のプログラムの実行結果(改良版)

次の結果のように、1行飛びになっていた表示が連続した行の表示に修正されています。

$ python test.py
test1
test2
test3
test4
test5
test6
test7
test8
test9
test10

-python
-

© 2020 Tommy's blog Powered by AFFINGER5