📁

【学習ログ】Pythonで拡張子別にファイルを自動分類

2025/02/19に公開

作成しようと思った経緯

今まで、ダウンロードファイルを定期的にフォルダ分けしたり、削除したりしていたのですが、この作業が意外と時間のかかるもので、どうにか自動化できないかと悩んでいました。
そこで、今回はその面倒なファイル整理を自動で行ってくれるPythonスクリプトを作成しました。
少しでも同じような悩みを抱えている方の手助けになれば嬉しいです。

使用するライブラリ

今回使用するライブラリは、Pythonの標準ライブラリに含まれているため、別途インストールする必要はありません。
以下がライブラリの用途です。

import os #ファイル・フォルダの操作
import shutil #ファイルの移動

実際のコード

main.py
import os
import shutil

target_folder = "C:/Users/Username/Downloads"

# 拡張子ごとの分類ルール
file_categories = {
    "images": [".jpg", ".jpeg", ".png", ".gif", ".bmp"],
    "documents": [".pdf", ".docx", ".xlsx", ".txt"],
    "videos": [".mp4", ".avi", ".mov", ".mkv"],
    "archives": [".zip", ".rar", ".tar", ".gz"],
    "music": [".mp3", ".wav", ".flac"],
}

# ファイルを分類する関数
def organize_files(folder):
    if not os.path.exists(folder):
        print(f"指定されたフォルダ '{folder}' が存在しません。")
        return

    for file in os.listdir(folder):
        file_path = os.path.join(folder, file)

        # ファイルのみ対象(フォルダはスキップ)
        if not os.path.isfile(file_path):
            continue

        # 拡張子を取得
        _, ext = os.path.splitext(file)

        # 拡張子が一致するフォルダへ移動
        for category, extensions in file_categories.items():
            if ext.lower() in extensions:
                category_folder = os.path.join(folder, category)
                if not os.path.exists(category_folder):
                    os.makedirs(category_folder)  # フォルダがない場合は作成
                shutil.move(file_path, os.path.join(category_folder, file))
                print(f"Moved: {file}{category}/")
                break 

# 実行
organize_files(target_folder)
print("ファイル整理が完了しました!")

コード解説

ファイルの分類方法を定義

各ファイルの拡張子をどのように分類するのか辞書形式で定義します。
""が整理する際のフォルダ名になります。
[]でフォルダに入れる拡張子を指定しています。

file_categories = {
    "images": [".jpg", ".jpeg", ".png", ".gif", ".bmp"],
    "documents": [".pdf", ".docx", ".xlsx", ".txt"],
    "videos": [".mp4", ".avi", ".mov", ".mkv"],
    "archives": [".zip", ".rar", ".tar", ".gz"],
    "music": [".mp3", ".wav", ".flac"],
}

メイン処理関数の実装

organize_files関数が主にファイル整理をします。
手順は以下の通りです。

  1. 指定されたフォルダの存在確認
  2. フォルダ内のファイルを順番に処理
  3. 各ファイルの拡張子を確認
  4. カテゴリーフォルダを作成
  5. 各フォルダ対応するファイルをそれぞれ移動させる
def organize_files(folder):
    if not os.path.exists(folder):
        print(f"指定されたフォルダ '{folder}' が存在しません。")
        return
    
    for file in os.listdir(folder):
        file_path = os.path.join(folder, file)
        
        # ファイルのみ処理(フォルダはスキップ)
        if not os.path.isfile(file_path):
            continue
            
        # 拡張子を取得して処理
        _, ext = os.path.splitext(file)
        for category, extensions in file_categories.items():
            if ext.lower() in extensions:
                category_folder = os.path.join(folder, category)
                if not os.path.exists(category_folder):
                    os.makedirs(category_folder)
                shutil.move(file_path, os.path.join(category_folder, file))
                print(f"Moved: {file}{category}/")
                break

使い方

  1. スクリプトのtarget_folder変数に整理したいフォルダのパスを設定します。
target_folder = "C:/Users/Username/Downloads"
  1. ターミナルで以下のコマンドを実行すると、先ほど定義したファイル分類方法に基づいてファイルを整理してくれます。
python main.py

注意点

  • 同じ名前のファイルが既に移動先フォルダに存在する場合、上書きされる可能性があります。
  • 拡張子がfile_categoriesで定義されていないファイルは移動しません。

参考文献

https://note.nkmk.me/python-shutil-move/
https://qiita.com/imuimu/items/8225848536f87e4eead4
https://kino-code.com/files-move/

ヘッドウォータース

Discussion