Python
 Computer >> コンピューター >  >> プログラミング >> Python

【Python】ジャンクファイルオーガナイザーで面倒なファイル整理を一括自動化

はじめに

大量のファイルやフォルダをひとつのディレクトリに放り込みっぱなしにして、「何のファイルがあったんだっけ?」と混乱しがちなPythonプログラマーは少なくありません。そんな「怠惰(=効率重視)」な開発者にとって、手作業でのファイル整理は面倒この上ないものです。

そこで本記事では、散らかったフォルダ内のファイルを拡張子ごとに適切なフォルダへ一括で振り分け、さらに不要になった空のディレクトリまで削除してくれるPythonスクリプトを紹介します。コマンドひとつでフォルダがすっきり片付くので、ぜひ活用してみてください。

具体的には、さまざまな種類のファイルが混在したディレクトリ(下図)を入力として与えると、プログラムが自動的に各ファイルを種類別のフォルダへ整理し、次のような整然とした構成を作り出します。

入力フォルダ構造(整理前)

【Python】ジャンクファイルオーガナイザーで面倒なファイル整理を一括自動化

期待される出力結果(整理後)

【Python】ジャンクファイルオーガナイザーで面倒なファイル整理を一括自動化

ステップ1:分類先フォルダと拡張子の定義

まず、振り分け先となるフォルダ名と、そこに格納する拡張子のリストを辞書型で定義します。画像・動画・ドキュメント・アーカイブなど、用途に応じて自由にカテゴリを追加・編集できます。

DIRECTORIES = {
    "HTML": [".html5", ".html", ".htm", ".xhtml"],
    "IMAGES": [".jpeg", ".jpg", ".tiff", ".gif", ".bmp", ".png", ".bpg", "svg",
    ".heif", ".psd"],
    "VIDEOS": [".avi", ".flv", ".wmv", ".mov", ".mp4", ".webm", ".vob", ".mng",
    ".qt", ".mpg", ".mpeg", ".3gp"],
    "DOCUMENTS": [".oxps", ".epub", ".pages", ".docx", ".doc", ".fdf", ".ods",
    ".odt", ".pwi", ".xsn", ".xps", ".dotx", ".docm", ".dox",
    ".rvg", ".rtf", ".rtfd", ".wpd", ".xls", ".xlsx", ".ppt",
    "pptx"],
    "ARCHIVES": [".a", ".ar", ".cpio", ".iso", ".tar", ".gz", ".rz", ".7z",
    ".dmg", ".rar", ".xar", ".zip"],
    "AUDIO": [".aac", ".aa", ".aac", ".dvf", ".m4a", ".m4b", ".m4p", ".mp3",
    ".msv", "ogg", "oga", ".raw", ".vox", ".wav", ".wma"],
    "PLAINTEXT": [".txt", ".in", ".out"],
    "PDF": [".pdf"],
    "PYTHON": [".py"],
    "XML": [".xml"],
    "EXE": [".exe"],
    "SHELL": [".sh"]
}

ステップ2:拡張子とフォルダのマッピング処理

続いて、定義した辞書をもとに「拡張子 → フォルダ名」の対応表(FILE_FORMATS)を内包表記で生成します。その後、organise_folder()関数で実際の振り分けを行います。仕組みはシンプルで、os.scandir()でディレクトリ内のエントリを走査し、拡張子が対応表に存在すれば該当フォルダを作成して移動。どのカテゴリにも該当しないファイルは「OTHER-FILES」フォルダへまとめられます。

FILE_FORMATS = {file_format: directory
    for directory, file_formats in DIRECTORIES.items()
    for file_format in file_formats}
def organise_folder():
    for entry in os.scandir():
       if entry.is_dir():
           continue
       file_path = Path(entry)
       file_format = file_path.suffix.lower()
       if file_format in FILE_FORMATS:
           directory_path = Path(FILE_FORMATS[file_format])
           directory_path.mkdir(exist_ok=True)
           file_path.rename(directory_path.joinpath(file_path))

    try:
       os.mkdir("OTHER-FILES")
    except:
       pass

    for dir in os.scandir():
       try:
           if dir.is_dir():
               os.rmdir(dir)
           else:
               os.rename(os.getcwd() + '/' + str(Path(dir)), os.getcwd() + '/OTHER-FILES/' + str(Path(dir)))
       except:
pass

完成版スクリプト

以上の手順をすべて統合したのが、以下の最終スクリプトです。これをコピー&ペーストするだけで、すぐに使い始められます。

#Python Lazy Junk Files Organizer

#必要なライブラリをインポート
import os
from pathlib import Path

#
DIRECTORIES = {
    "HTML": [".html5", ".html", ".htm", ".xhtml"],
    "IMAGES": [".jpeg", ".jpg", ".tiff", ".gif", ".bmp", ".png", ".bpg", "svg",
    ".heif", ".psd"],
    "VIDEOS": [".avi", ".flv", ".wmv", ".mov", ".mp4", ".webm", ".vob", ".mng",
    ".qt", ".mpg", ".mpeg", ".3gp"],
    "DOCUMENTS": [".oxps", ".epub", ".pages", ".docx", ".doc", ".fdf", ".ods",
    ".odt", ".pwi", ".xsn", ".xps", ".dotx", ".docm", ".dox",
    ".rvg", ".rtf", ".rtfd", ".wpd", ".xls", ".xlsx", ".ppt",
    "pptx"],
    "ARCHIVES": [".a", ".ar", ".cpio", ".iso", ".tar", ".gz", ".rz", ".7z",
    ".dmg", ".rar", ".xar", ".zip"],
    "AUDIO": [".aac", ".aa", ".aac", ".dvf", ".m4a", ".m4b", ".m4p", ".mp3",
    ".msv", "ogg", "oga", ".raw", ".vox", ".wav", ".wma"],
    "PLAINTEXT": [".txt", ".in", ".out"],
    "PDF": [".pdf"],
    "PYTHON": [".py"],
    "XML": [".xml"],
    "EXE": [".exe"],
    "SHELL": [".sh"]
}

FILE_FORMATS = {file_format: directory
    for directory, file_formats in DIRECTORIES.items()
    for file_format in file_formats}

def organise_folder():
    for entry in os.scandir():
       if entry.is_dir():
           continue
       file_path = Path(entry)
       file_format = file_path.suffix.lower()
       if file_format in FILE_FORMATS:
           directory_path = Path(FILE_FORMATS[file_format])
           directory_path.mkdir(exist_ok=True)
           file_path.rename(directory_path.joinpath(file_path))
    try:
       os.mkdir("OTHER-FILES")
    except:
       pass

    for dir in os.scandir():
       try:
           if dir.is_dir():
               os.rmdir(dir)
           else:
               os.rename(os.getcwd() + '/' + str(Path(dir)), os.getcwd() + '/OTHER-FILES/' + str(Path(dir)))
       except:
           pass
if __name__ == "__main__":
    organise_folder()

このスクリプトを整理したいディレクトリ内で実行すると、以下のようにファイルがきれいに分類されます。

実行結果

【Python】ジャンクファイルオーガナイザーで面倒なファイル整理を一括自動化


  1. Pythonで作るWebサイトブロッカー ― 業務時間中にSNSへのアクセスを自動遮断する方法

    大手IT企業で働いたことがある方なら、FacebookやYouTube、InstagramといったSNS系のWebサイトが社内からアクセスできないよう制限されていることに気づいた経験があるかもしれません。こうした制限は、サードパーティ製アプリに頼らなくても実現できます。自分専用のオリジナルツールを作れば、好きなWebサイトを自由にブロックできるのです。しかもPythonでWebサイトブロッカーを開発するのは、それほど難しいことではありません。この記事では、指定したWebサイトをブロックするPythonスクリプトの作り方を解説します。前提条件Python 3.x がインストールされていることPy

  2. Pythonで作る誕生日リマインダーアプリケーションの完全ガイド

    この記事では、Pythonを使って誕生日リマインダーアプリケーションを作成する方法を解説します。当日の誕生日を自動的にチェックし、デスクトップ通知で教えてくれる便利なツールを、初心者でも理解できるようにステップごとに説明していきます。 課題の定義 まず、このアプリケーションに求められる要件を整理しましょう。 Pythonで、当日が登録済みの人物の誕生日かどうかを判定できること 誕生日の人物がいれば、その人の名前とともにシステムへ通知を送信すること このアプリケーションでは、日付・月・氏名を保存した「ルックアップファイル(照合用データファイル)」が必要です。ファイルのイメージは以下の通りです