
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


