Pythonでファイルを読み込む際に、 FileNotFoundError
というエラーが発生することがある。
原因を先に言うと、名前の通り「ファイルが見つからない」エラーである。
単体のファイルを処理する場合であれば不足しているファイルを追加するなり作成するなりすればいいが、複数のファイルを処理する場合にはエラーとせずに処理したいこともあるだろう。
今回はこの FileNotFoundError
の原因と回避方法を紹介する。
FileNotFoundErrorの原因
FileNotFoundErrorの原因は「ファイルが見つからない」、つまり存在しないファイルにアクセスしようとしたので発生している。
以下の例だと、ループの中で 0.csv
から 2.csv
までアクセスしようとしているが、 1.csv
が無いので読み込めずにエラーになっている。
file_not_found_v0.py csv └0.csv └2.csv
import pandas as pd for i in range(3): filename = "csv/{}.csv".format(str(i)) print(filename) df = pd.read_csv(filename) print(df) print() # csv/0.csv # column # 0 value # 1 value # 2 value # csv/1.csv # FileNotFoundError: [Errno 2] File b'csv/1.csv' does not exist: b'csv/1.csv'
FileNotFoundErrorの回避方法
先の例のように複数ファイルを読み込んで処理する場合、一部ファイルは存在しないことがある。
しかし存在しない場合にエラーとして処理を止めたい場合もあれば、ファイルが存在しない場合を許容して、存在するファイルだけを処理したい場合もある。
存在するファイルだけを処理したい場合、 FileNotFoundError
を回避する必要があるが、方法としては2つある。
FileNotFoundErrorの回避方法
ファイルの存在確認をしてから処理する
ファイルが無い場合にアクセスしようとするとエラーになるのであれば、まずファイルの存在確認をして、ファイルが無い場合はアクセスしないようにすればいい。
ファイルの存在確認をする場合は os.path.exists()
を用いる。
引数には存在を確認したいファイルのパスを記載する。
import pandas as pd import os for i in range(3): filename = "csv/{}.csv".format(str(i)) print(filename) if os.path.exists(filename): df = pd.read_csv(filename) print(df) else: print("{} not found.".format(filename)) print() # csv/0.csv # column # 0 value # 1 value # 2 value # # csv/1.csv # csv/1.csv not found. # # csv/2.csv # column # 0 value # 1 value # 2 value
エラーをスキップする
もうひとつの方法はエラーをスキップする方法だ。
FileNotFoundError
が発生してもプログラムの処理を止めないようにする。
具体的には try
処理の中で、FileNotFoundError
のエラー発生時のみスキップ用の except
の処理に飛ばして、次のループを実行するようにする。
するとファイルの存在確認をした際と同様に、存在するファイルのみを処理する事ができる。
for i in range(3): filename = "csv/{}.csv".format(str(i)) print(filename) try: df = pd.read_csv(filename) print(df) except FileNotFoundError as e: print("{} not found.".format(filename)) print() # csv/0.csv # column # 0 value # 1 value # 2 value # # csv/1.csv # csv/1.csv not found. # # csv/2.csv # column # 0 value # 1 value # 2 value