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