【Python】フォルダ内のファイルを自動で整理するスクリプトを作る

Python

こんにちは、かつコーチです。

ダウンロードフォルダの中が、画像・PDF・zipでぐちゃぐちゃになっていませんか。

「手作業で仕分けるのは面倒だけど、いちいち探すのも大変」

そんな悩みは、Pythonの標準ライブラリ(追加インストールなしで使える公式のライブラリ)だけで解決できます。

この記事では、拡張子ごとにファイルを自動で振り分けるスクリプトを、手順を追って作成します。

読み終える頃には、自分のPCのフォルダ整理を自動化できるようになります。

基本の書き方・実装手順

手順1:対象フォルダの中身を確認する

まずは、整理したいフォルダの中にあるファイル一覧を取得します。

pathlib(ファイルパスを扱う標準ライブラリ)のPathクラスを使います。

from pathlib import Path

target_dir = Path("./sample_folder")

for file in target_dir.iterdir():
    if file.is_file():
        print(file.name)

iterdir()はフォルダの中身(ファイルとフォルダ両方)を1つずつ返します。

file.is_file()で、フォルダではなくファイルだけに絞り込んでいます。

手順2:拡張子ごとに振り分け先フォルダを決める

次に、拡張子と振り分け先フォルダの対応表を辞書で用意します。

EXTENSION_MAP = {
    ".jpg": "images",
    ".jpeg": "images",
    ".png": "images",
    ".pdf": "documents",
    ".docx": "documents",
    ".zip": "archives",
    ".csv": "data",
}

file.suffixでファイルの拡張子(.jpgなど)を取得できるので、この辞書と照合します。

手順3:shutil.moveでファイルを移動する

ファイルの移動にはshutil(ファイル操作の標準ライブラリ)のmove()関数を使います。

import shutil
from pathlib import Path

EXTENSION_MAP = {
    ".jpg": "images",
    ".jpeg": "images",
    ".png": "images",
    ".pdf": "documents",
    ".docx": "documents",
    ".zip": "archives",
    ".csv": "data",
}

def organize_folder(target_dir: Path) -> None:
    for file in target_dir.iterdir():
        if not file.is_file():
            continue

        folder_name = EXTENSION_MAP.get(file.suffix.lower())

        if folder_name is None:
            continue

        dest_dir = target_dir / folder_name
        dest_dir.mkdir(exist_ok=True)

        shutil.move(str(file), str(dest_dir / file.name))
        print(f"{file.name} を {folder_name}/ に移動しました。")

if __name__ == "__main__":
    organize_folder(Path("./sample_folder"))

dest_dir.mkdir(exist_ok=True)で、振り分け先フォルダがなければ自動作成しています。

exist_ok=Trueを付けないと、フォルダが既に存在する場合にFileExistsErrorが発生するので注意してください。

つまずきやすい設定・注意点

拡張子の判定では、file.suffixが大文字小文字を区別することに注意が必要です。

.JPG.jpgは別物として扱われるため、.lower()で小文字に統一してから辞書と照合しています。

また、対応表にない拡張子(.txt.pyなど)はcontinueでスキップし、そのままの場所に残す設計にしています。

よくあるつまずきポイント・エラー対処

同名ファイルが上書きされてしまう

これは筆者が実際に自分のダウンロードフォルダで試したときに遭遇したつまずきです。

report.pdfという同じ名前のファイルが2回ダウンロードされていて、移動先で片方が消えてしまいました。

❌ Before(同名チェックなしでそのまま移動する書き方)

import shutil
from pathlib import Path

def organize_folder(target_dir: Path) -> None:
    dest_dir = target_dir / "documents"
    dest_dir.mkdir(exist_ok=True)

    for file in target_dir.glob("*.pdf"):
        shutil.move(str(file), str(dest_dir / file.name))

organize_folder(Path("./sample_folder"))

このコードでは、移動先に同名のreport.pdfが既に存在していても、警告なく上書きされてしまいます。

実行後に気づいたときには、古いファイルの中身は完全に失われていました。

✅ After(同名ファイルにはリネームして移動する書き方)

import shutil
from pathlib import Path

def organize_folder(target_dir: Path) -> None:
    dest_dir = target_dir / "documents"
    dest_dir.mkdir(exist_ok=True)

    for file in target_dir.glob("*.pdf"):
        dest_path = dest_dir / file.name
        counter = 1

        while dest_path.exists():
            dest_path = dest_dir / f"{file.stem}_{counter}{file.suffix}"
            counter += 1

        shutil.move(str(file), str(dest_path))
        print(f"{file.name} を {dest_path.name} として移動しました。")

organize_folder(Path("./sample_folder"))

while dest_path.exists()で移動先に同名ファイルがないか確認し、あれば_1_2と連番を付けてリネームしています。

file.stemは拡張子を除いたファイル名なので、report_1.pdfのような形になります。

この一手間を入れるだけで、大切なファイルを誤って消してしまう事故を防げます。

まとめ

この記事のポイント

  • pathlib.Pathでフォルダ内のファイル一覧を取得できる
  • 拡張子と振り分け先の対応表を辞書で管理すると見通しがよい
  • shutil.move()でファイルを別フォルダに移動できる
  • mkdir(exist_ok=True)で移動先フォルダを安全に自動作成できる
  • 同名ファイルの上書き事故を防ぐには、存在チェックとリネーム処理が必須

次に読むべき記事

  • osモジュールでファイル・ディレクトリを操作する
  • pathlibでファイルパスをモダンに扱う
  • CSVファイルを一括処理する自動化スクリプトを書く

タグ: Python, 初心者向け, 自動化

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