こんにちは、かつコーチです。
ダウンロードフォルダの中が、画像・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, 初心者向け, 自動化