Pythonで簡単ファイル整理術!拡張子ごとに自動振り分けスクリプトを作ろう

「ダウンロード」フォルダやデスクトップが、いつの間にか色々なファイルで散らかってしまう…。そんな経験はありませんか? 今回は、Pythonを使って、指定したフォルダ内のファイルを拡張子(.txt, .jpg, .pdf など)ごとに自動でフォルダ分けしてくれる、簡単な「ファイル整理スクリプト」の作り方をご紹介します。

プログラミング初心者の方でも大丈夫!ステップ・バイ・ステップで解説していくので、ぜひ一緒に作ってみましょう。

スポンサーリンク

この記事で作るもの

指定したフォルダ内にあるファイルを、そのファイルの拡張子と同じ名前のサブフォルダ(例:txtフォルダ, jpgフォルダ)に自動で移動するPythonスクリプト。

必要なもの

  • Pythonがインストールされたパソコン(Python環境構築方法はこちらから。)
  • テキストエディタ(メモ帳、VSCode、Sublime Textなど何でもOK)

スクリプト作成を始める前に

安全に試すために、まずは準備から始めます。

  1. テスト用フォルダの作成
    • デスクトップなど分かりやすい場所に、「ファイル整理テスト」という名前の新しいフォルダを作りましょう。 (重要:いきなり大事なフォルダで試さないでください!)
  2. テスト用ファイルの用意
    • 作成した「ファイル整理テスト」フォルダの中に、いくつか種類の違うファイルを入れてみてください。(例: sample.txt, photo.jpg, document.pdf, empty.zip など。中身は空でも構いません)
  3. スクリプトファイルの作成
    • 「ファイル整理テスト」フォルダの中に、テキストエディタで file_organizer.py という名前の新しい空のファイルを作成し、保存します。ここにコードを書いていきます。

準備ができたら、いよいよコーディングです!

ステップ1: 魔法の呪文(モジュール)を唱える

ファイルやフォルダを操作するには、Pythonに元々備わっている「魔法の道具箱」のようなもの(モジュール)が必要です。今回は osshutil という道具を使います。 file_organizer.py の一番上に、以下のように書き込みましょう。

Python

import os      # ファイルやフォルダの基本的な操作に使う
import shutil  # ファイルの移動など、より高度な操作に使う

ステップ2: どのフォルダを整理するか教える

次に、どのフォルダを整理対象にするかスクリプトに教えます。今回は、スクリプト自身(file_organizer.py)が置かれているフォルダ、つまり先ほど作成した「ファイル整理テスト」フォルダを対象にします。

Python

# --- 設定 ---
# 整理したいフォルダのパスを指定します。
# './' はスクリプトファイルがある現在のフォルダを指します。
TARGET_FOLDER = './'
# --- 設定ここまで ---

# 念のため、絶対パスを表示して確認
print(f"整理対象フォルダ: {os.path.abspath(TARGET_FOLDER)}")

TARGET_FOLDER = './' の部分で、対象フォルダを指定しています。もし別の場所を指定したい場合は、 'C:\Users\YourName\Downloads' のようにフルパスで指定することも可能です。

ステップ3: フォルダの中身をリストアップ!

os.listdir() を使って、指定したフォルダの中にあるファイルやフォルダの名前を一覧にします。もしフォルダが見つからなかった場合のエラー処理も入れておきましょう。

Python

# (import文とTARGET_FOLDERの定義は省略)

try:
    # フォルダ内の全アイテムを取得
    items = os.listdir(TARGET_FOLDER)
    print(f"フォルダ内のアイテム: {items}")
except FileNotFoundError:
    print(f"エラー: 指定されたフォルダ '{TARGET_FOLDER}' が見つかりません。")
    exit() # フォルダがなければ処理終了

ステップ4: 一つずつチェックして、ファイルだけを選別

フォルダの中にはファイルだけでなく、他のフォルダが入っていることもあります。今回はファイルだけを整理したいので、for ループで一つずつアイテムを取り出し、それがファイルかどうか (os.path.isfile()) を確認します。

また、このスクリプト file_organizer.py 自体を移動してしまわないように、除外する処理も加えます。スクリプトを別のフォルダで動かす場合は必要ないかもしれません。

Python

# (import文、TARGET_FOLDER定義、items取得は省略)

# 実行中のスクリプトファイル名を取得(自分自身を移動しないため)
script_name = os.path.basename(__file__)

# 各アイテムを処理
for item_name in items:
    # アイテムのフルパスを作成 (例: ./sample.txt)
    item_path = os.path.join(TARGET_FOLDER, item_name)

    # アイテムが「ファイル」であり、かつ「このスクリプト自身ではない」場合のみ処理
    if os.path.isfile(item_path) and item_name != script_name:
        print(f"ファイル発見: {item_name}")
        # ↓↓↓ ここにファイルに対する処理を書いていく ↓↓↓

    else:
        # ファイル以外(フォルダなど)やスクリプト自身はスキップ
        if item_name != script_name: # スクリプト自身以外の場合だけメッセージ表示
             print(f"スキップ: {item_name} (ファイルではない)")

os.path.join() は、OSの違い(Windowsの\やMac/Linuxの/)を吸収して、正しくファイルパスを組み立ててくれる便利な関数です。

ステップ5: 拡張子を取り出す

ファイルの種類を判別するために、拡張子(ファイル名の最後の .xxx の部分)を取り出します。拡張子がないファイルは今回は無視します。拡張子の大文字・小文字は区別しないように、小文字に統一しておきましょう。

Python

# (forループと if os.path.isfile() のブロック内)

        # ファイル名と拡張子を分割 (例: ('sample', '.txt'))
        root, extension = os.path.splitext(item_name)

        # 拡張子がないファイルはスキップ
        if not extension:
            print(f"  スキップ: {item_name} (拡張子なし)")
            continue # ループの次の処理へ

        # 拡張子の最初のドットを除去し、小文字に統一 (例: '.TXT' -> 'txt')
        extension_name = extension[1:].lower()
        print(f"  拡張子: {extension_name}")

ステップ6: 移動先のフォルダを作る

拡張子と同じ名前のフォルダ(例:txtフォルダ、jpgフォルダ)がなければ、os.makedirs() で作成します。すでにある場合は何もしません。

Python

# (拡張子を取得した後)

        # 移動先のフォルダパスを作成 (例: ./txt)
        dest_folder_path = os.path.join(TARGET_FOLDER, extension_name)

        # フォルダがまだ存在しない場合のみ作成
        if not os.path.exists(dest_folder_path):
            try:
                os.makedirs(dest_folder_path)
                print(f"  フォルダ作成: {dest_folder_path}")
            except OSError as e:
                print(f"  エラー: フォルダ '{dest_folder_path}' の作成に失敗しました。 {e}")
                continue # フォルダ作成失敗時はこのファイルの処理を中断

ステップ7: いよいよファイルを移動!

準備が整ったのでshutil.move() を使って、ファイルを対応する拡張子のフォルダに移動させます。

Python

# (フォルダを作成 or 確認した後)

        # 移動元のフルパス (item_path はステップ4で作成済み)
        source_path = item_path
        # 移動先のフルパス (例: ./txt/sample.txt)
        dest_path = os.path.join(dest_folder_path, item_name)

        try:
            print(f"  移動: {item_name} -> {extension_name}/")
            shutil.move(source_path, dest_path)
        except Exception as e:
            print(f"  エラー: ファイル '{item_name}' の移動に失敗しました。 {e}")

ステップ8: 完成コード全体

これまでのステップをすべて組み合わせた、完成版のコードはこちらです。

Python

import os
import shutil

# --- 設定 ---
# 整理したいフォルダのパスを指定 ( './' はスクリプトがある現在のフォルダ)
TARGET_FOLDER = './'
# --- 設定ここまで ---

print(f"--- ファイル整理を開始します ---")
print(f"対象フォルダ: {os.path.abspath(TARGET_FOLDER)}")

# 実行中のスクリプトファイル名を取得(自分自身を移動しないため)
script_name = os.path.basename(__file__)

try:
    # フォルダ内の全アイテムを取得
    items = os.listdir(TARGET_FOLDER)
except FileNotFoundError:
    print(f"エラー: 指定されたフォルダ '{TARGET_FOLDER}' が見つかりません。")
    exit() # 終了

# 各アイテムを処理
for item_name in items:
    item_path = os.path.join(TARGET_FOLDER, item_name)

    # アイテムがファイルであり、かつ、このスクリプト自身ではない場合のみ処理
    if os.path.isfile(item_path) and item_name != script_name:
        # ファイル名と拡張子を取得
        root, extension = os.path.splitext(item_name)

        # 拡張子がない場合はスキップ
        if not extension:
            print(f"スキップ: {item_name} (拡張子なし)")
            continue

        # 拡張子名のフォルダパスを作成 (ドットを除去し小文字化)
        extension_name = extension[1:].lower()
        dest_folder_path = os.path.join(TARGET_FOLDER, extension_name)

        # フォルダが存在しなければ作成
        if not os.path.exists(dest_folder_path):
            try:
                os.makedirs(dest_folder_path)
                print(f"フォルダ作成: {dest_folder_path}")
            except OSError as e:
                print(f"エラー: フォルダ '{dest_folder_path}' の作成に失敗しました。 {e}")
                continue # このファイルの処理をスキップ

        # ファイルを移動
        source_path = item_path
        dest_path = os.path.join(dest_folder_path, item_name)
        try:
            print(f"移動: {item_name} -> {extension_name}/")
            shutil.move(source_path, dest_path)
        except Exception as e:
            print(f"エラー: ファイル '{item_name}' の移動に失敗しました。 {e}")

    else:
        # ファイル以外(フォルダなど)やスクリプト自身はスキップ
        if item_name != script_name: # スクリプト自身でない場合のみメッセージ表示
             print(f"スキップ: {item_name} (ファイルではない)")

print(f"--- ファイル整理が完了しました ---")

ステップ9: スクリプトを実行してみよう!

  1. 完成したコードを file_organizer.py にコピペして保存します。
  2. コマンドプロンプト(Windows)またはターミナル(Mac/Linux)を開きます。
  3. cd コマンドを使って、「ファイル整理テスト」フォルダに移動します。
    • cd C:\Users\あなたのユーザー名\Desktop\ファイル整理テスト (Windowsの例)
    • cd /Users/あなたのユーザー名/Desktop/ファイル整理テスト (Mac/Linuxの例)
  4. 次のコマンドを入力して、スクリプトを実行します。

    Bash

    python file_organizer.py
    
  5. 実行後、「ファイル整理テスト」フォルダを見てみましょう。ファイルが txt, jpg, pdf といった拡張子ごとのフォルダに移動されていれば成功です!

さらにパワーアップさせるには? (応用編)

  • 特定のファイルは移動しない: 特定のファイル名や拡張子(例: .exe)は移動しないように条件分岐を追加する。
  • フォルダ名を指定: .jpg.png をまとめて 画像 フォルダに入れるなど、拡張子とフォルダ名の対応を自分で決められるようにする(辞書を使うと便利)。
  • 対象フォルダをユーザー入力に: スクリプト実行時に、どのフォルダを整理するかユーザーに尋ねるように input() 関数を使う。
  • より丁寧なエラー処理: ファイルが使用中で移動できない場合などのエラーにも対応する。
スポンサーリンク
スポンサーリンク

まとめ

今回はPythonを使って、散らかったフォルダを自動で整理する簡単なスクリプトを作成しました。ほんの数十行のコードで、日々のちょっとした面倒を解決できるのがプログラミングの面白いところです。 これを機に、身の回りの「もっとこうだったら便利なのに」をPythonで解決できないか考えてみるのも楽しいかもしれませんね!

ぜひ、このスクリプトを改造したり、他の便利なツール作りに挑戦してみてください。

スポンサーリンク

コメント

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