はじめに
どの言語でもファイルやディレクトリの存在チェック処理が必要なケースは多々ありますが、今回はpythonでのファイル/ディレクトリに対する存在チェック処理についてまとめておきます。
pythonでは「osモジュール」を利用してチェックする方法と「pathlibモジュール」を使った方法があります。
それぞれのモジュールを使ったファイル/ディレクトリ存在チェックについては下記の通りです。
OSモジュールを利用したファイル/ディレクトリ存在確認
関数 | 説明 |
---|---|
os.path.isdir([“ディレクトリパス”]) | ディレクトリが存在するかどうかチェックする |
os.path.isfile([“ファイルパス”]) | ファイルが存在するかどうかチェックする |
os.path.exists([“ファイル/ディレクトリパス”]) | ファイルまたはディレクトリが存在するかどうかチェックする |
ファイルの存在確認
ファイルが存在するかどうか確認する場合は「os.path.isfile」メソッドを利用して存在確認を行います。
下記のようなディレクトリ構成を用意しておきます
([D]:ディレクトリ、[F]:ファイル)
[D] python
┣ [D] test
┃┗ [F] test001.txt
┗ [F] sample001.py
import os
EXIST_FILE_PATH = './test/test001.txt'
NOT_EXIST_FILE_PATH = './test/test002.txt'
EXIST_DIR_PATH = './test'
NOT_EXIST_DIR_PATH = './test001'
print("Result [EXIST_FILE_PATH] : {0}". format(os.path.isfile(EXIST_FILE_PATH)))
print("Result [NOT_EXIST_FILE_PATH] : {0}". format(os.path.isfile(NOT_EXIST_FILE_PATH)))
print("Result [EXIST_DIR_PATH] : {0}". format(os.path.isfile(EXIST_DIR_PATH)))
print("Result [NOT_EXIST_DIR_PATH] : {0}". format(os.path.isfile(NOT_EXIST_DIR_PATH)))
結果は「True」または「False」が返ってきます。
$ python sample001.py
Result [EXIST_FILE_PATH] : True
Result [NOT_EXIST_FILE_PATH] : False
Result [EXIST_DIR_PATH] : False
Result [NOT_EXIST_DIR_PATH] : False
ファイルパスに対して存在するかどうかチェックする場合には本メソッドを利用するのが良いかと思います。
ディレクトリの存在確認
ディレクトリ(フォルダ)が存在するかどうか確認する場合は「os.path.isdir」メソッドを利用して存在確認を行います。
ファイルチェックの時と同様に下記のようなディレクトリ構成を用意しておきます。
[D] python
┣ [D] test
┃┗ [F] test001.txt
┗ [F] sample001.py
import os
EXIST_FILE_PATH = './test/test001.txt'
NOT_EXIST_FILE_PATH = './test/test002.txt'
EXIST_DIR_PATH = './test'
NOT_EXIST_DIR_PATH = './test001'
print("Result [EXIST_FILE_PATH] : {0}". format(os.path.isfile(EXIST_FILE_PATH)))
print("Result [NOT_EXIST_FILE_PATH] : {0}". format(os.path.isfile(NOT_EXIST_FILE_PATH)))
print("Result [EXIST_DIR_PATH] : {0}". format(os.path.isfile(EXIST_DIR_PATH)))
print("Result [NOT_EXIST_DIR_PATH] : {0}". format(os.path.isfile(NOT_EXIST_DIR_PATH)))
結果は「True」または「False」が返ってきます。
$ python sample001.py
Result [EXIST_FILE_PATH] : False
Result [NOT_EXIST_FILE_PATH] : False
Result [EXIST_DIR_PATH] : True
Result [NOT_EXIST_DIR_PATH] : False
ファイルまたはディレクトリの存在確認
ファイルとディレクトリの両方の存在チェックを行う場合は「os.path.exists」メソッドを利用して存在確認を行います。
ファイルパスやフォルダパスが混在する配列に対して、一気に存在確認などを行いたい場合などで利用すると良いかと思います。
ファイル/ディレクトリチェックの時と同様に下記のようなディレクトリ構成を用意しておきます。
[D] python
┣ [D] test
┃┗ [F] test001.txt
┗ [F] sample001.py
import os
EXIST_FILE_PATH = './test/test001.txt'
NOT_EXIST_FILE_PATH = './test/test002.txt'
EXIST_DIR_PATH = './test'
NOT_EXIST_DIR_PATH = './test001'
print("Result [EXIST_FILE_PATH] : {0}". format(os.path.exists(EXIST_FILE_PATH)))
print("Result [NOT_EXIST_FILE_PATH] : {0}". format(os.path.exists(NOT_EXIST_FILE_PATH)))
print("Result [EXIST_DIR_PATH] : {0}". format(os.path.exists(EXIST_DIR_PATH)))
print("Result [NOT_EXIST_DIR_PATH] : {0}". format(os.path.exists(NOT_EXIST_DIR_PATH)))
結果は「True」または「False」が返ってきます。
$ python sample001.py
Result [EXIST_FILE_PATH] : True
Result [NOT_EXIST_FILE_PATH] : False
Result [EXIST_DIR_PATH] : True
Result [NOT_EXIST_DIR_PATH] : False
pathlibモジュールを使ったファイルおよびディレクトリの存在確認
方法 | 説明 |
---|---|
existsメソッド利用 | pathlib.Pathで設定したパスに対してexistsメソッドでのチェックを行う |
例外処理を利用 | try-exceptを利用して存在有無の確認を行う |
existsメソッドを利用した存在確認(ファイルまたはディレクトリ)
pathlibモジュールでは、一度ファイルパスを「Path」メソッドに設定してから「exists」メソッドを利用して存在確認を行う。
パス構成は下記の通りとする
[D] python
┣ [D] test
┃┗ [F] test001.txt
┗ [F] sample001.py
import pathlib
EXIST_FILE_PATH = './test/test001.txt'
NOT_EXIST_FILE_PATH = './test/test002.txt'
EXIST_DIR_PATH = './test'
NOT_EXIST_DIR_PATH = './test001'
exist_file_path = pathlib.Path(EXIST_FILE_PATH)
not_exist_file_path = pathlib.Path(NOT_EXIST_FILE_PATH)
exist_dir_path = pathlib.Path(EXIST_DIR_PATH)
not_exist_dir_path = pathlib.Path(NOT_EXIST_DIR_PATH)
print("Result [EXIST_FILE_PATH] : {0}". format(exist_file_path.exists()))
print("Result [NOT_EXIST_FILE_PATH] : {0}". format(not_exist_file_path.exists()))
print("Result [EXIST_DIR_PATH] : {0}". format(exist_dir_path.exists()))
print("Result [NOT_EXIST_DIR_PATH] : {0}". format(not_exist_dir_path.exists()))
結果は「True」または「False」が返ってきます。
$ python sample001.py
Result [EXIST_FILE_PATH] : True
Result [NOT_EXIST_FILE_PATH] : False
Result [EXIST_DIR_PATH] : True
Result [NOT_EXIST_DIR_PATH] : False
osモジュールを利用する場合より、Path設定行を記載する分若干面倒ですね。
例外処理を利用してファイル/ディレクトリの存在確認を行う
例外処理(try-except)を利用して存在確認を行うことができます。
その場合は「resolve」メソッドを利用します。
resolveメソッドはパスを絶対パスにするメソッドで、今回はstrict引数をTrueに設定し、FileNotFoundErrorを送出するようにします。
import pathlib
EXIST_FILE_PATH = './test/test001.txt'
NOT_EXIST_FILE_PATH = './test/test002.txt'
EXIST_DIR_PATH = './test'
NOT_EXIST_DIR_PATH = './test001'
exist_file_path = pathlib.Path(EXIST_FILE_PATH)
not_exist_file_path = pathlib.Path(NOT_EXIST_FILE_PATH)
exist_dir_path = pathlib.Path(EXIST_DIR_PATH)
not_exist_dir_path = pathlib.Path(NOT_EXIST_DIR_PATH)
try:
result = exist_file_path.resolve(strict=True)
except FileNotFoundError:
print("Result [EXIST_FILE_PATH] : False")
else:
print("Result [EXIST_FILE_PATH] : True")
try:
result = not_exist_file_path.resolve(strict=True)
except FileNotFoundError:
print("Result [NOT_EXIST_FILE_PATH] : False")
else:
print("Result [NOT_EXIST_FILE_PATH] : True")
try:
result = exist_dir_path.resolve(strict=True)
except FileNotFoundError:
print("Result [EXIST_DIR_PATH] : False")
else:
print("Result [EXIST_DIR_PATH] : True")
try:
result = not_exist_dir_path.resolve(strict=True)
except FileNotFoundError:
print("Result [NOT_EXIST_DIR_PATH] : False")
else:
print("Result [NOT_EXIST_DIR_PATH] : True")
ファイルまたはディレクトリが存在しない場合は「FileNotFoundError」の例外エラーが発生します。そうでない場合は通常通り「else」側にて後続処理を行います。
$ python sample001.py
Result [EXIST_FILE_PATH] : True
Result [NOT_EXIST_FILE_PATH] : False
Result [EXIST_DIR_PATH] : True
Result [NOT_EXIST_DIR_PATH] : False
最後に
ファイルやディレクトリの存在確認はファイルI/Oが絡む処理では必須な処理となります。
様々なやり方をインプットしておくと良いかと思います。