Python

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

Share this for your friends.

【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
    

    Share this for your friends.

    ITipsと同じようなブログを作る方法

    ブログに興味がありますか?

    もしブログに興味がある場合は↓このページ↓を参考にすれば、ITipsと同じ構成でブログを作ることができます

    サーバー、ドメイン、ASPと【ブログに必要なものは全て】このページに書きました。
    同じ構成でブログ作るのはいいけど、記事はマネしないでネ (TДT;)

    ランキング参加中

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

    他にもブログやSNSで紹介してくれると励みになります。

    はてブのコメントで酷評されると泣きます(´;ω;`)

    -Python
    -,

    © 2024 ITips