Python

【Python】FileNotFoundErrorの原因と回避方法

【Python】FileNotFoundErrorの原因と回避方法

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
    

    コチラもオススメ

    KRSW

    駆け出し機械学習エンジニア。機械学習、DB、WEBと浅く広い感じ。 Junior machine learning engineer. Not a specialist but a generalist who knows DB, WEB too.

    役に立ったらシェアしてくれると励みになります。

    にほんブログ村 IT技術ブログへ

    -Python
    -,

    Translate »

    Copyright© ITips , 2020 All Rights Reserved.