Python 業務自動化 | ファイル・フォルダ自動化:基本操作 - ファイル存在確認

Python Python
スポンサーリンク

「ファイル存在確認」は業務自動化の“安全装置”

業務自動化でファイルを扱うとき、最初に必ずやってほしいのが「そのファイル、本当にある?」という確認です。
存在しないファイルを開こうとすると FileNotFoundError、上書きしたくないファイルをうっかり消してしまうと取り返しがつきません。

だからこそ、「ファイル存在確認」は“おまけ”ではなく、“安全装置”として最初に組み込むべき処理です。


基本の3兄弟:exists / isfile / isdir を理解する

os.path.exists で「とにかくあるかどうか」を知る

「そのパスに、ファイルかフォルダかは問わないから、とにかく何かあるか知りたい」というときは os.path.exists() を使います。

import os

path = "config/settings.yaml"

if os.path.exists(path):
    print("存在します:", path)
else:
    print("存在しません:", path)
Python

ここでのポイントは、「ファイルでもフォルダでも、存在していれば True」ということです。
設定ファイル、入力ファイル、出力先フォルダなど、「とりあえず有無だけ知りたい」ときの第一候補になります。

os.path.isfile で「ファイルであること」を確認する

「そのパスが“ファイル”であることを確認したい」ときは os.path.isfile() を使います。

import os

path = "data/input.csv"

if os.path.isfile(path):
    print("ファイルが存在します:", path)
else:
    print("ファイルが存在しないか、フォルダです:", path)
Python

存在しない場合はもちろん False、フォルダであっても False になります。
「読み込む対象が本当にファイルかどうか」をチェックしたいときに使います。

os.path.isdir で「フォルダであること」を確認する

フォルダを対象にした処理(一覧取得、削除、バックアップなど)では、os.path.isdir() が使えます。

import os

path = "data"

if os.path.isdir(path):
    print("フォルダが存在します:", path)
else:
    print("フォルダが存在しないか、ファイルです:", path)
Python

exists / isfile / isdir をセットで覚えておくと、「今欲しいのは何か?」に応じて使い分けられるようになります。


重要ポイントを深掘り:なぜ「存在確認」がそんなに大事なのか

読み込み前の存在確認でエラーを防ぐ

存在しないファイルを open() しようとすると、Pythonは容赦なく FileNotFoundError を投げます。

with open("data/input.csv", encoding="utf-8") as f:
    ...
Python

これを業務バッチでやると、「夜中の処理が途中で落ちていた」なんてことになりかねません。
そこで、読み込み前にこう書きます。

import os

path = "data/input.csv"

if not os.path.isfile(path):
    print("エラー: 入力ファイルがありません:", path)
else:
    with open(path, encoding="utf-8") as f:
        print("読み込み開始")
Python

「存在しないなら、きちんとメッセージを出して終わる」だけでも、現場でのトラブル対応がかなり楽になります。

書き込み前の存在確認で「誤上書き」を防ぐ

もう一つ重要なのが、「書き込み前の存在確認」です。
上書きしたくないファイルに対して、何も考えずに open(..., "w") すると、中身が消えます。

import os

path = "data/result.csv"

if os.path.exists(path):
    print("警告: すでに存在します。上書きしたくない場合は処理を中止してください:", path)
else:
    with open(path, "w", encoding="utf-8") as f:
        f.write("header1,header2\n")
        print("新規作成しました:", path)
Python

「存在していたらどうするか」を自分で決めてコードに書く――これが業務自動化の“プロっぽさ”です。


例題①:設定ファイルがなければエラーメッセージを出して終了する

シナリオ

アプリの動作に必要な settings.yaml がなければ、処理を続けても意味がない。
その場合は、わかりやすいメッセージを出して終了したい。

コード例

import os
import sys

config_path = "config/settings.yaml"

if not os.path.isfile(config_path):
    print("エラー: 設定ファイルが見つかりません:", config_path)
    sys.exit(1)

print("設定ファイルを確認しました。処理を続行します。")
Python

ここでは os.path.isfile を使って、「存在する」かつ「ファイルである」ことを確認しています。
exists ではなく isfile を使うことで、「同名のフォルダがあった」ようなレアケースも弾けます。


例題②:バックアップ前に「元ファイルがあるか」を確認するテンプレート

シナリオ

data/report.csvbackup/report.csv にコピーしたい。
ただし、元ファイルがなければコピーしても意味がないので、その場合はメッセージを出して終わりたい。

コード例

import os
import shutil

src = "data/report.csv"
dst_dir = "backup"
dst = os.path.join(dst_dir, "report.csv")

if not os.path.isfile(src):
    print("エラー: バックアップ元のファイルがありません:", src)
else:
    os.makedirs(dst_dir, exist_ok=True)
    shutil.copy(src, dst)
    print("バックアップ完了:", dst)
Python

ここでも isfile を使うことで、「フォルダを間違って指定していた」ようなミスを早期に検知できます。


例題③:ファイルがなければ新規作成、あれば「すでにあります」と知らせる

シナリオ

names.txt というファイルがなければ新規作成し、
すでにある場合は「もうあるよ」とメッセージを出したい。

コード例

import os

file_name = "names.txt"

if not os.path.isfile(file_name):
    with open(file_name, mode="x", encoding="utf-8") as f:
        f.write("Taro\n")
    print("ファイルを新規作成しました:", file_name)
else:
    print("既にファイルは存在しています:", file_name)
Python

ここでは mode="x" を使って「新規作成専用」にしています。
存在しているのに "x" で開こうとするとエラーになるため、「存在確認+安全な新規作成」の組み合わせとしてよく使われるテクニックです。


pathlib を使った、少しモダンな存在確認

Path.exists / is_file / is_dir の書き心地

最近のPythonでは、pathlib を使う書き方もよく使われます。
パスを文字列ではなく「オブジェクト」として扱えるので、慣れると読みやすく感じる人も多いです。

from pathlib import Path

p = Path("data/input.csv")

if p.is_file():
    print("ファイルがあります:", p)
else:
    print("ファイルがありません:", p)
Python

フォルダの場合は p.is_dir()、とにかく存在するかだけ知りたい場合は p.exists() が使えます。
os.path 版とやっていることは同じなので、まずは os.path に慣れてから pathlib に移行しても十分です。


まとめ:「存在確認」を最初に書くクセが、コードの質を上げる

ここまで見てきたように、ファイル存在確認は地味ですが、業務自動化では“要”になります。

ファイルがないのに読み込もうとして落ちる
上書きしたくないのに何も確認せずに書き込む
フォルダだと思っていたら実はファイルだった

こうした事故は、ほぼすべて「最初に一行、存在確認を書いておく」ことで防げます。

os.path.exists で「とにかくあるか」
os.path.isfile で「ファイルかどうか」
os.path.isdir で「フォルダかどうか」

この3つを、もう“反射的に”書けるくらいまで使い倒してみてください。
今あなたが手でやっている「ファイルがあるか確認してから…」という作業は、今日のテンプレートでそのままコードにできます。

タイトルとURLをコピーしました