【Python連載】テキストファイルを1行ずつ読み込む


前回、Pythonでテキストファイルを扱いました。
今回は、テキストファイルを開く際のopen関数まわりについて、+αをみていきましょう。

  • with~as構文を使おう
  • open関数の引数

with~as構文を使おう

前回は、テキストファイルをPythonで扱う方法について紹介しました。
基本的には、

・open関数でファイルを開く
・何らかの処理をする
・close関数でファイルを閉じる

というのがPythonでファイルを扱う際の流れになります。
close関数は、open関数で取得したファイルを閉じます。
この際、close関数を記述し忘れると、ファイルがプログラム上に読み込まれたまま、閉じられないことになります。
前回あげたようなサンプルのような短いプログラムでは、ファイルを扱うタイミングが
ファイルを閉じる = プログラムの終了
となっているため、あまり問題は起きないのですが、読み込みだけでなく書き込みの動作を
プログラム上で行うようになったり、Pythonを用いたシステムが作成したファイルを、
同システムや他のプログラムがあとから使おうとした際に、閉じられていないために
ファイルへのアクセス権を得られなかったりする場合があります。

そういった動作が起きるのを防ぐためにclose関数を記載することが大切なのですが…
複雑なプログラムになったり例外処理等を盛り込んでいくと、どこでファイルをcloseするべきなのかわかりづらかったり、closeを書き忘れてしまうケースが起こります。
なので、Pythonではcloseを明示的に記述しなくてもよい構文が用意されています。
それが、with~as構文です。

with~as構文について

open関数でファイルを開く際、with~asを使用することで、closeを明示的に記述しなくても
処理が終わった時点でファイルを閉じてくれるようになります。
以下のように記述します。

with open(file, mode) as 変数:
   #何らかの処理

このようにwith~asを使うと、以下のようにopen関数を記述した際と同じ処理になります。

変数 = open(file, mode)
   #何らかの処理
変数.close()

with~asを使えば、close関数を書き忘れることはなくなるわけですね。

また、のちの記事で取り上げる予定ですが、ファイルを扱う操作には例外処理を合わせて書くことが非常に多いです。
ファイルが存在しない、ファイルへのアクセス権を得られない、など例外が発生しやすいからですね。
これはPythonの公式ドキュメントでも触れられていることなのですが、with~asのメリットの1つとして、
「withを使うと処理中に例外が発生しても必ず最後にファイルを閉じることができる」
というものもあります。

では、前回の記事で扱ったサンプルをwith~asで書き直してみましょう。
前回のものがこちら。

file1 = open("sample.txt")

lines = file1.read()        ### file1の内容をreadで読み込み、linesに代入している

print(lines)

file1.close()

openでファイルを開き、readで内容を読み取り、closeで閉じています。
これをwith~asを使って記述すると、以下のようになります。

with open("sample.txt") as file1:
	
	lines = file1.read()
	
	print(lines)
C:\Python> python 14-2_1.py
Hello Python!

YAH YAH YAH

Goodbye Python

文量が減ったり、見やすくなったりという効果はそれほどですが、closeを書かなくても確実に
ファイルが閉じられるという安心感がありますね。


  • このエントリーをはてなブックマークに追加

PAGE TOP