Python

フォルダ内のファイルを
拡張子別に自動整理・リネーム

散らかったダウンロードフォルダなどを、拡張子ごとのサブフォルダに自動で振り分けるPythonスクリプトです。ファイル名への日付付与にも対応。

Python 3 pathlib shutil ファイル操作
処理の流れ
📁
フォルダ走査
全ファイルを取得
🔍
拡張子判定
種別マッピング
📂
フォルダ作成
なければ自動生成
🚚
ファイル移動
shutil.move
スクリプト(Python)
Python 3file_organizer.py
from pathlib import Path
import shutil
from datetime import datetime

# 拡張子→フォルダ名のマッピング
EXT_MAP = {
    '画像'    : ['.jpg', '.jpeg', '.png', '.gif', '.webp'],
    '動画'    : ['.mp4', '.mov', '.avi', '.mkv'],
    '文書'    : ['.pdf', '.docx', '.xlsx', '.pptx'],
    'テキスト': ['.txt', '.md', '.csv'],
    'コード'  : ['.py', '.js', '.html', '.css'],
    '圧縮'    : ['.zip', '.tar', '.gz'],
}

def get_folder_name(ext: str) -> str:
    """拡張子からフォルダ名を返す(未定義は 'その他')"""
    for folder, exts in EXT_MAP.items():
        if ext.lower() in exts:
            return folder
    return 'その他'

def organize(target_dir: str, add_date: bool = True):
    """フォルダ内ファイルを拡張子別に整理"""
    base  = Path(target_dir)
    moved = 0

    for file in base.iterdir():
        if not file.is_file():
            continue

        folder_name = get_folder_name(file.suffix)
        dest_dir    = base / folder_name
        dest_dir.mkdir(exist_ok=True)

        # 日付プレフィックスを付与(オプション)
        if add_date:
            date_str = datetime.now().strftime('%Y%m%d_')
            new_name = dest_dir / (date_str + file.name)
        else:
            new_name = dest_dir / file.name

        # 同名ファイルが存在する場合は連番を付与
        counter = 1
        while new_name.exists():
            stem     = new_name.stem + f'_{counter}'
            new_name = dest_dir / (stem + file.suffix)
            counter += 1

        shutil.move(str(file), str(new_name))
        print(f"移動: {file.name} → {folder_name}/")
        moved += 1

    print(f"\n✅ 完了: {moved}件のファイルを整理しました")

if __name__ == '__main__':
    organize('/Users/yourname/Downloads', add_date=True)
ポイント解説
📂
フォルダが存在しない場合は自動生成 mkdir(exist_ok=True) で、フォルダがなくても自動作成するため事前準備が不要です。
🔢
同名ファイルの上書き防止 既に同名ファイルが存在する場合は自動で連番を付与し、データの消失を防ぎます。
🗂️
EXT_MAPで柔軟にカスタマイズ 対応する拡張子とフォルダ名の対応表を変更するだけで、任意の整理ルールに対応できます。