6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

tuat-sysbiolabAdvent Calendar 2024

Day 3

Pythonでのファイル整理術

Posted at

Pythonで学ぶファイル整理術:年末の片付けにも役立つ

1.はじめに

年末になるとPCの中も整理したくなりますよね?
特に「ダウンロードフォルダがごちゃごちゃしている…」と感じる人も多いはず。
そこで今回は、Pythonを使って ファイルやフォルダを自動で整理するスクリプト を作成します!
簡単なコードで効率よく整理できるので、ぜひ試してみてください。


2.必要な準備

Pythonの標準ライブラリ(osやshutil)を使うので、特別なインストールは不要です。
Pythonがインストールされていれば、すぐに始められます。


3.実現すること

このスクリプトでは以下を実現します:

・フォルダ内のファイルを拡張子ごとに分類し、サブフォルダに移動。
・古いファイルをアーカイブ(ZIP圧縮)。
:不要な空フォルダを削除。
年末の整理だけでなく、日常的なファイル管理にも役立ちます!

実装コード

import os
import shutil
import datetime
from zipfile import ZipFile

def organize_files(folder_path):
    """フォルダ内のファイルを整理する"""
    extensions = {
        "画像": [".jpg", ".png", ".gif"],
        "ドキュメント": [".pdf", ".docx", ".txt"],
        "動画": [".mp4", ".mkv", ".avi"],
        "アーカイブ": [".zip", ".rar", ".7z"],
    }

    for filename in os.listdir(folder_path):
        file_path = os.path.join(folder_path, filename)
        if not os.path.isfile(file_path):
            continue

        _, ext = os.path.splitext(filename)
        for category, ext_list in extensions.items():
            if ext.lower() in ext_list:
                category_folder = os.path.join(folder_path, category)
                os.makedirs(category_folder, exist_ok=True)

                destination = os.path.join(category_folder, filename)
                counter = 1
                while os.path.exists(destination):
                    base, ext = os.path.splitext(filename)
                    destination = os.path.join(category_folder, f"{base}_{counter}{ext}")
                    counter += 1

                shutil.move(file_path, destination)
                print(f"{filename}{category} に移動しました。")
                break
        else:
            else_folder = os.path.join(folder_path, "その他")
            os.makedirs(else_folder, exist_ok=True)
            shutil.move(file_path, os.path.join(else_folder, filename))
            print(f"{filename} を その他 に移動しました。")

def archive_old_files(folder_path, days=30):
    """指定日数以上経過したファイルをアーカイブ"""
    now = datetime.datetime.now()
    archive_folder = os.path.join(folder_path, "アーカイブ")
    os.makedirs(archive_folder, exist_ok=True)

    for filename in os.listdir(folder_path):
        file_path = os.path.join(folder_path, filename)
        if not os.path.isfile(file_path):
            continue

        modified_time = datetime.datetime.fromtimestamp(os.path.getmtime(file_path))
        if (now - modified_time).days > days:
            zip_path = os.path.join(archive_folder, "old_files.zip")
            with ZipFile(zip_path, 'a') as archive:
                if filename not in archive.namelist():
                    archive.write(file_path, arcname=filename)
            os.remove(file_path)
            print(f"{filename} をアーカイブしました。")

def remove_empty_folders(folder_path):
    """空フォルダを削除する"""
    for root, dirs, files in os.walk(folder_path, topdown=False):
        for dir_name in dirs:
            dir_path = os.path.join(root, dir_name)
            if not os.listdir(dir_path):
                os.rmdir(dir_path)
                print(f"{dir_path} を削除しました。")

if __name__ == "__main__":
    target_folder = input("整理したいフォルダのパスを入力してください: ")
    if os.path.exists(target_folder):
        organize_files(target_folder)
        archive_old_files(target_folder)
        remove_empty_folders(target_folder)
        print("整理が完了しました!")
    else:
        print(f"指定されたフォルダが見つかりません: {target_folder}")


4.実行例

整理前のフォルダ

downloads/
├── photo1.jpg
├── report.pdf
├── video.mp4
├── old_data.txt

整理後フォルダ

downloads/
├── 画像/
│   └── photo1.jpg
├── ドキュメント/
│   ├── report.pdf
│   └── old_data.txt
├── 動画/
│   └── video.mp4
├── アーカイブ/
    └── old_files.zip

解説
ファイルの分類(def organize_files)
・os.listdir()で指定フォルダ内のファイルを取得。
・拡張子はos.path.splitext()で抽出し、辞書に基づいて分類。
古いファイルのアーカイブ(def archive_old_files)
・ファイルの最終更新日時はos.path.getmtime()で取得。
・日付判定を行い、古いファイルをZIPに圧縮。
空フォルダの削除(def remove_empty_folder)
・os.walk()でフォルダを再帰的に探索し、空フォルダを削除。


5.応用例

・自動実行:WindowsのタスクスケジューラやLinuxのcronで定期実行。
・クラウド連携:整理したファイルをGoogle DriveやDropboxにアップロード。
・レポート生成:整理した結果をCSVやHTML形式で保存。


6.まとめ

この記事では、Pythonを使ってファイルやフォルダを自動で整理する方法を紹介しました。
年末の大掃除や日常的な整理に役立てていただけると嬉しいです!
ぜひ、自分の環境に合わせてカスタマイズしてみてください。

6
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?