FileExistsErrorとは?原因・対処法をPython初心者向けに解説

Pythonを実行していると、

FileExistsError: [Errno 17] File exists

というエラーが表示されることがあります。

これは、すでに存在しているファイルやディレクトリを作成しようとしたときに発生するエラーです。Python公式ドキュメントでも、FileExistsError は「すでに存在するファイルやディレクトリを作成しようとした場合」に送出される例外と説明されています。 (Python documentation)

本記事では、FileExistsError の意味から、os.mkdir()、os.makedirs()、open()を使った場合の原因、具体的な対処法まで解説します。


FileExistsErrorとは?

FileExistsError(ファイル・イグジスツ・エラー)は、作成しようとしたファイルやディレクトリがすでに存在するときに発生する例外です。

例えば、次のコードを実行します。

import os

os.mkdir("data")

このコードを初めて実行した場合、「data」というディレクトリが存在しなければ正常に作成されます。

しかし、同じコードをもう一度実行すると、

FileExistsError: [Errno 17] File exists: 'data'

というエラーが発生します。

これはPythonが、

「data」というディレクトリを作ろうとしたが、すでに存在している

と判断したためです。

FileExistsError は OSError のサブクラスで、OS側の EEXIST エラーに対応しています。 (Python documentation)


FileExistsErrorが発生する原因

主な原因は次の3つです。

  1. すでに存在するディレクトリを作成しようとしている

  2. すでに存在するファイルを作成しようとしている

  3. 同じ処理を繰り返し実行している

特にPython初心者が遭遇しやすいのが、os.mkdir() と os.makedirs()です。


os.mkdir()でFileExistsErrorが発生する

os.mkdir()は、新しいディレクトリを作成するための関数です。

import os

os.mkdir("data")

「data」ディレクトリが存在しない場合は、正常に作成されます。

しかし、すでに存在している場合は、

FileExistsError: [Errno 17] File exists: 'data'

となります。

Python公式ドキュメントでも、os.mkdir()は対象ディレクトリがすでに存在する場合にFileExistsErrorを送出すると説明されています。 (Python documentation)

対処法

ディレクトリが存在するか確認してから作成します。

import os

if not os.path.exists("data"):
    os.mkdir("data")

これなら、すでにdataディレクトリが存在していてもエラーになりません。

ただし、ディレクトリを作成する用途では、より簡単な方法があります。


os.makedirs()ならexist_ok=Trueを使う

os.makedirs()は、複数階層のディレクトリをまとめて作成できます。

例えば、

import os

os.makedirs("data/images")

とすると、

data/
└── images/

のようなディレクトリを作成できます。

ところが、すでにディレクトリが存在すると、デフォルトではFileExistsErrorになります。

そこで、

os.makedirs("data/images", exist_ok=True)

とします。

exist_ok=Trueを指定すると、対象ディレクトリがすでに存在していてもエラーを発生させません。Python公式ドキュメントでも、exist_ok=Falseがデフォルトで、既存ディレクトリの場合にFileExistsErrorが発生すると説明されています。 (Python documentation)

よく使われる書き方

import os

os.makedirs("data/images", exist_ok=True)

「存在すれば何もしない、存在しなければ作成する」という処理になるため、機械学習や画像処理、データ分析などで非常によく使われます。


FileExistsErrorをtry-exceptで処理する

例外処理を使ってFileExistsErrorを処理する方法もあります。

import os

try:
    os.mkdir("data")
except FileExistsError:
    print("ディレクトリはすでに存在します")

dataが存在しなければディレクトリを作成します。

すでに存在する場合は、

ディレクトリはすでに存在します

と表示されます。


FileExistsErrorを無視する

「ディレクトリが存在していても特に問題ない」という場合は、次のようにも書けます。

import os

try:
    os.mkdir("data")
except FileExistsError:
    pass

ただし、この方法よりも、

os.makedirs("data", exist_ok=True)

のほうが意図が明確で、シンプルです。


open()でもFileExistsErrorが発生する場合がある

FileExistsErrorはディレクトリ作成だけでなく、ファイル作成時にも発生する場合があります。

例えば、open()で排他的に新しいファイルを作成するxモードを使用した場合です。

with open("sample.txt", "x") as f:
    f.write("Hello")

sample.txtが存在しない場合はファイルが作成されます。

しかし、すでに存在している場合は、

FileExistsError

が発生します。

これはxモードが「新しいファイルを作成し、すでに存在する場合はエラーにする」という動作だからです。


「FileExistsError」と「FileNotFoundError」の違い

名前が似ているため、初心者が混同しやすいのがFileNotFoundErrorです。

エラー 意味
FileExistsError ファイルやディレクトリがすでに存在する
FileNotFoundError ファイルやディレクトリが存在しない
PermissionError アクセス権限がない
IsADirectoryError ファイルとして扱おうとした対象がディレクトリ
NotADirectoryError ディレクトリとして扱おうとした対象がディレクトリではない

例えば、

os.mkdir("data")

でdataがすでに存在していれば、

FileExistsError

です。

一方、

os.mkdir("data/images")

でdata自体が存在しない場合には、FileNotFoundErrorになる可能性があります。os.mkdir()は親ディレクトリを自動作成しないためです。 (Python documentation)


FileExistsErrorが発生したときの確認ポイント

エラーが発生したら、次のポイントを確認しましょう。

1. 対象のファイル・ディレクトリが存在していないか

例えば、

os.mkdir("data")

なら、現在の作業ディレクトリにdataが存在していないか確認します。


2. 同じコードを2回実行していないか

Jupyter NotebookやGoogle Colabでは特に注意が必要です。

os.mkdir("data")

を一度実行した後、同じセルをもう一度実行するとFileExistsErrorが発生します。


3. os.makedirs()ならexist_ok=Trueを検討する

os.makedirs("data/images", exist_ok=True)

とすれば、すでに存在するディレクトリを再作成してもエラーになりません。


実践的な書き方

例えば、機械学習用のデータ保存ディレクトリを作る場合は、

import os

output_dir = "output"

os.makedirs(output_dir, exist_ok=True)

print("保存先を準備しました")

としておくと便利です。

初回実行時には、

output/

が作成されます。

2回目以降はすでに存在するため、何もせず処理を続けられます。


pathlibを使ったFileExistsError対策

最近のPythonでは、pathlibを使ってパスを扱う方法もおすすめです。

from pathlib import Path

path = Path("data")
path.mkdir(exist_ok=True)

これも、dataが存在していればエラーを発生させず、存在しなければ作成します。

複数階層のディレクトリなら、

from pathlib import Path

path = Path("data/images")
path.mkdir(parents=True, exist_ok=True)

と書けます。

parents=Trueを指定すると、必要な親ディレクトリも作成できます。


FileExistsErrorを解決する方法まとめ

方法 特徴
os.path.exists() 存在を確認してから作成
os.makedirs(..., exist_ok=True) 既存ならエラーにしない
try-except エラーを明示的に処理
Path.mkdir(exist_ok=True) pathlibを使った書き方
Path.mkdir(parents=True, exist_ok=True) 親ディレクトリもまとめて作成

特におすすめなのは、

os.makedirs("data", exist_ok=True)

または、

from pathlib import Path

Path("data").mkdir(exist_ok=True)

です。


FileExistsErrorの原因を理解して正しく対処しよう

FileExistsErrorは、Pythonが壊れているわけではありません。

「作成しようとしたファイルやディレクトリがすでに存在しています」という意味のエラーです。 (Python documentation)

特に、

os.mkdir("data")

や、

os.makedirs("data")

を繰り返し実行したときに発生しやすいエラーです。

「存在していても問題ない」という処理なら、

os.makedirs("data", exist_ok=True)

とするのが簡単です。

一方、「すでに存在している場合は処理を止めたい」という仕様なら、FileExistsErrorをそのまま発生させるか、try-exceptで明示的に処理するとよいでしょう。


FAQ

Q. FileExistsErrorとは何ですか?

すでに存在するファイルやディレクトリを作成しようとしたときに発生するPythonの例外です。 (Python documentation)

Q. FileExistsErrorを無視するには?

os.makedirs()の場合は、exist_ok=Trueを指定します。

os.makedirs("data", exist_ok=True)

Q. os.mkdir()とos.makedirs()の違いは?

os.mkdir()は基本的に1つのディレクトリを作成するのに対し、os.makedirs()は必要な親ディレクトリも含めて階層的に作成できます。 (Python documentation)

Q. FileExistsErrorとFileNotFoundErrorの違いは?

FileExistsErrorは「すでに存在する」、FileNotFoundErrorは「存在しない」という違いです。


関連するPythonエラー

Pythonでは、ファイル操作に関連して次のエラーもよく発生します。

ファイル・ディレクトリ操作では、「対象が存在するのか」「対象がファイルなのかディレクトリなのか」「アクセス権限があるのか」を確認すると、エラーの原因を特定しやすくなります。

他のPythonエラーの原因と対処法はPythonエラー一覧と対処法に種類別でまとめています。エラーメッセージの読み方もあわせて解説しています。