見出し画像

【簡単時短】Pythonでファイルの種類、名前、サイズの条件を組み合わせて1発で整理する方法

「ぐちゃぐちゃのフォルダ内を一発で整理したい」
「1つ1つフォルダ作るのめんどくさい。自動で作成してほしい」
「あのファイルどこいった!?あーもう時間がない!」

本記事ではこのような方を対象に、Pythonで特定のフォルダ内にあるファイルを「ファイルの種類」、「ファイル名」、「サイズ」の条件を組み合わせて自動的に分類する方法をご紹介します。

今までの入門編とは異なり、若干複雑になっているのでファイルを移動させる際はよく考えてから移動させるようにしてください。

※一度移動させると手動でしか戻せないので注意です。

■本記事で分かること
Pythonで特定のフォルダ内にあるファイルを「ファイルの種類」、「ファイル名」、「サイズ」の条件を組み合わせて自動的に分類する方法

■本記事の信頼性
私は、本業でChatGPTなどのAIツールを活用して効率化を実現。ほぼ毎日定時で帰宅し、家族との充実した時間を確保している「なおき」といいます。

AIと全く無縁の体育系で文系出身(数学Ⅱで終わりました)の私でもできる時短術をわかりやすく説明できるよう、Xなどを活用して情報発信しています。

また、note開始3か月で総閲覧回数は約5000回
約5ケタ/月に至る記事の購入をいただきました!

これからも皆様のお役に立てる記事を配信していくのでよろしくお願いします!

今回は、非エンジニアでもできる「Pythonで特定のフォルダ内にあるファイルを「ファイルの種類」、「ファイル名」、「サイズ」の条件を組み合わせて自動的に分類する方法」をご紹介します!

1.Pythonで整理したいフォルダの準備

まずは、ファイル名やファイルの種類がごちゃまぜで整理できていないフォルダと整理先のフォルダを準備してください。

ファイルが混在したフォルダ

今回は、ダウンロードフォルダの中に「test」フォルダを作り、以下のファイルを混在させました。

  • Reports:txtファイル、1KB

  • Invoices:PNGファイル、828KB

  • Video:MP4ファイル、約10MB

  • Memos:PDFファイル、約9.9MB

あわせて、testフォルダ内に各ファイルを分類させるための「移動先フォルダ」を作成しておきましょう。

2.Pythonスクリプトの準備

次に、Pythonスクリプトを準備します。

以下のスクリプトをお使いの実行環境(VScodeなど)にコピペして下さい。

import os
import shutil
from datetime import datetime

# 分類するファイルがあるディレクトリ
source_directory = 'path/to/your/source/directory'

# 分類先のベースディレクトリ
destination_base = 'path/to/your/destination/directory'

# ファイルタイプに基づく分類
file_type_folders = {
    '.txt': 'TextFiles',
    '.pdf': 'PDFs',
    '.jpg': 'Images',
    '.png': 'Images',
}

# ファイル名キーワードに基づく分類
filename_keywords_folders = {
    'report': 'Reports',
    'invoice': 'Invoices',
    'memo': 'Memos',
}

# ファイルサイズに基づく分類
size_categories = {
    'Small': 1024 * 1024,  # 1MB未満
    'Medium': 1024 * 1024 * 100,  # 1MB以上100MB未満
    'Large': float('inf')  # 100MB以上
}

# ファイルを適切なフォルダに分類する関数
def classify_files(directory):
    for filename in os.listdir(directory):
        file_path = os.path.join(directory, filename)
        if os.path.isfile(file_path):
            file_size = os.path.getsize(file_path)
            _, file_extension = os.path.splitext(filename)
            
            # 拡張子に基づく分類
            type_folder = file_type_folders.get(file_extension, 'Other')

            # ファイル名に基づく分類
            keyword_folder = 'General'
            for keyword, folder_name in filename_keywords_folders.items():
                if keyword in filename.lower():
                    keyword_folder = folder_name
                    break
            
            # サイズに基づく分類
            size_folder = 'OtherSizes'
            for category, max_size in size_categories.items():
                if file_size < max_size:
                    size_folder = category
                    break
            
            # 最終的な分類先ディレクトリ
            destination_folder = os.path.join(destination_base, type_folder, keyword_folder, size_folder)
            
            # 分類先のフォルダが存在しない場合は作成
            if not os.path.exists(destination_folder):
                os.makedirs(destination_folder)
            
            # ファイルを移動
            shutil.move(file_path, destination_folder)
            print(f'Moved: {file_path} -> {destination_folder}')

# スクリプトの実行
if __name__ == '__main__':
    classify_files(source_directory)

このスクリプトは、指定されたディレクトリ内のファイルを以下の項目に応じて分類してくれるものです。

1.「ファイルの拡張子」に基づく分類
ファイルの拡張子を確認し、対応するフォルダ(例:TextFiles, Images)に分類します。対応する拡張子がなければ、Otherフォルダに分類されます。

2.「ファイル名に含まれる特定のキーワード」に基づく分類
ファイル名に特定のキーワードが含まれているか確認し、対応するキーワードのフォルダ(例:Reports, Invoices)に分類します。
キーワードが見つからない場合はGeneralフォルダに分類されます。

3.「ファイルサイズ」に基づく分類
ファイルのサイズを確認し、設定されたサイズ範囲に基づいてサイズごとのカテゴリ(例:Small, Medium, Large)に分類します。
どの範囲にも当てはまらない場合はOtherSizesに分類されます。

ちなみに、各ファイルを複数の条件(拡張子、ファイル名のキーワード、ファイルサイズ)に基づいて階層的に分類していますが、それぞれの条件は独立して適用されます。

つまり、すべての条件が「AND」で一致するわけではなく、各条件に基づいてフォルダが分けられ、ファイルはそれぞれの属性に応じたサブフォルダに分類されるということです。

もちろん、分類のキーワードなどを変更したい場合はカスタマイズできるので、ご自身の好みに合わせて以下の部分を変更してください。

【ファイルの拡張子を変えたい場合】
以下は、「txtファイル」→「TextFiles」というフォルダに分類されるようになっているので、拡張子と保存先フォルダ名を変更してください。

# ファイルタイプに基づく分類
file_type_folders = {
    '.txt': 'TextFiles',
    '.pdf': 'PDFs',
    '.jpg': 'Images',
    '.png': 'Images',
}

【ファイル名に含まれる特定のキーワードを変えたい場合】
以下は、ファイル名が「report」→「Reports」というフォルダに分類されるようになっているので、ファイル名と保存先フォルダ名を変更してください。

# ファイル名キーワードに基づく分類
filename_keywords_folders = {
    'report': 'Reports',
    'invoice': 'Invoices',
    'memo': 'Memos',
}

【ファイルサイズを変えたい場合】
以下は、ファイルのサイズが「1MB未満」→「Small」というフォルダに分類されるようになっているので、指定するサイズと保存先フォルダ名を変更してください。

# ファイルサイズに基づく分類
size_categories = {
    'Small': 1024 * 1024,  # 1MB未満
    'Medium': 1024 * 1024 * 100,  # 1MB以上100MB未満
    'Large': float('inf')  # 100MB以上
}

最後に、このままだと移動したいフォルダと移動先のフォルダのパスが指定されていない状態なので、以下の部分を指定のフォルダのパスにしてください。

【変更する箇所】

# 分類するファイルがあるディレクトリ
source_directory = 'path/to/your/source/directory'

# 分類先のベースディレクトリ
destination_base = 'path/to/your/destination/directory'

【変更後】
注意点として、スラッシュを「\\」のように2つにすることを忘れないでください。

# 分類するファイルがあるディレクトリ
source_directory = 'C:\\Users\\・・・・・\\test'

# 分類先のベースディレクトリ(変更が必要な場合はここを編集してください)
destination_base = 'C:\\Users\\・・・・・\\test\\移動先フォルダ'

先ほど設定した「test」フォルダと「移動先フォルダ」をパスに入れました。

ここまで出来たら、あとは実行するだけです!

3.Pythonスクリプトの実行

実行すると、自動で以下のように分類されました!

移動後の状況

images、Others、PDFs、TextFilesの4つのフォルダが自動で作成されていますね。

個別に開いてみると以下のようになります👇

ファイル名InvoicesはPNGファイルなのでimages/Invoices/1MB未満なのでSmallへ
ファイル名Videoはキーワードに該当しないのでOthers/General/100MB未満なのでMediumへ
ファイル名MemosはPDFファイルなのでPDFs/Memos/100MB未満なのでMediumへ
ファイル名ReportsはtxtファイルなのでTextFiles/Reports/1MB未満なのでSmallへ

個々のファイルがちゃんと分類されていることが確認できました!

以上で、作業は終了です。
お疲れ様でした!!

4.まとめ

今回は、「Pythonで特定のフォルダ内にあるファイルを「ファイルの種類」、「ファイル名」、「サイズ」の条件を組み合わせて自動的に分類する方法」をテーマに紹介しましたが、いかがだったでしょうか?

  1. 分類したいファイルと分類先のフォルダの準備

  2. Pythonスクリプトの設定とキーワード等の入力

  3. Pythonスクリプトの実行

上記の内容が実行できれば、ワンクリックで特定のフォルダ内にあるファイルを指定した条件に応じて自動的に分類できるようになります!

ただし、一度移動させると元に戻す動作はできないので、よく考えて設定してから移動させてくださいね。

私は1回間違ってしまい、全てのファイルを元に戻すというスーパー無駄作業をやってしまいましたので…

上手く使うことができれば、分類先のフォルダも自動で作成されるため1発で全てのファイルを分類できるので是非試してみて下さいね!

もし、組み合わせた分類が難しい…という方は以下のように1つ1つ順番に分類もできます!

  • ファイルの種類

  • ファイルの名前

  • ファイルの作成日

  • ファイルのサイズ

  • ファイルの内容

このような分類もPythonで自動的にできるので是非使ってみて下さい👇

みなさんの業務が少しでも効率化できれば、スキ、SNSでの紹介をしていただけると大変励みになりますので、何卒よろしくお願いします!

このほか、AI×時短術の知識をX(旧Twitter)で紹介していますので、是非フォローしてください!

この記事が気に入ったらサポートをしてみませんか?