From 6ac03458664baf0e33add16144fb42ceafc2b0d9 Mon Sep 17 00:00:00 2001 From: Sangam Paudel Date: Wed, 15 Oct 2025 09:59:43 +0545 Subject: [PATCH] Add smart file organizer --- README.md | 1 + smart_file_organizer.py | 127 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 128 insertions(+) create mode 100644 smart_file_organizer.py diff --git a/README.md b/README.md index 873ea61f1b9..a1521508a59 100644 --- a/README.md +++ b/README.md @@ -55,6 +55,7 @@ Feel free to explore the scripts and use them for your learning and automation n 40. [Test Case Generator](https://github.com/Tanmay-901/test-case-generator/blob/master/test_case.py) - Generate different types of test cases with a clean and friendly UI, used in competitive programming and software testing. 41. [Extract Thumbnail From Video](https://github.com/geekcomputers/Python/tree/ExtractThumbnailFromVideo) - Extract Thumbnail from video files 42. [How to begin the journey of open source (first contribution)](https://www.youtube.com/watch?v=v2X51AVgl3o) - First Contribution of open source +43. [smart_file_organizer.py](https://github.com/sangampaudel530/Python2.0/blob/main/smart_file_organizer.py) - Organizes files in a directory into categorized subfolders based on file type (Images, Documents, Videos, Audios, Archives, Scripts, Others). You can run it once or automatically at set intervals using the `--path` and `--interval` options.
_**Note**: The content in this repository belongs to the respective authors and creators. I'm just providing a formatted README.md for better presentation._ diff --git a/smart_file_organizer.py b/smart_file_organizer.py new file mode 100644 index 00000000000..3150251678e --- /dev/null +++ b/smart_file_organizer.py @@ -0,0 +1,127 @@ +#!/usr/bin/env python3 +""" +Smart File Organizer + +A utility script to organize files in a specified directory into categorized +subfolders based on file types. + +Example categories include: Images, Documents, Videos, Audios, Archives, Scripts, Others. + +Usage: + python smart_file_organizer.py --path "C:\\Users\\YourName\\Downloads" --interval 0 + +Arguments: + --path Directory path to organize. + --interval Interval in minutes to repeat automatically (0 = run once). + +Author: + Sangam Paudel +""" + +import os +import shutil +import argparse +import time +from datetime import datetime + +FILE_CATEGORIES = { + "Images": [".jpg", ".jpeg", ".png", ".gif", ".bmp", ".tiff", ".svg"], + "Documents": [".pdf", ".doc", ".docx", ".txt", ".ppt", ".pptx", ".xls", ".xlsx"], + "Videos": [".mp4", ".mkv", ".mov", ".avi", ".flv", ".wmv"], + "Audios": [".mp3", ".wav", ".aac", ".flac", ".ogg"], + "Archives": [".zip", ".rar", ".tar", ".gz", ".7z"], + "Scripts": [".py", ".js", ".sh", ".bat", ".java", ".cpp", ".c"], +} + + +def create_folder(folder_path: str) -> None: + """ + Create a folder if it does not already exist. + + Args: + folder_path: Path of the folder to create. + """ + if not os.path.exists(folder_path): + os.makedirs(folder_path) + + +def get_category(file_ext: str) -> str: + """ + Determine the category of a file based on its extension. + + Args: + file_ext: File extension (e.g., ".txt"). + + Returns: + Category name (e.g., "Documents") or "Others" if not matched. + """ + for category, extensions in FILE_CATEGORIES.items(): + if file_ext.lower() in extensions: + return category + return "Others" + + +def organize_files(base_path: str) -> None: + """ + Organize files in the given directory into subfolders by category. + + Args: + base_path: Path of the directory to organize. + """ + files = [f for f in os.listdir(base_path) if os.path.isfile(os.path.join(base_path, f))] + if not files: + print(f"[{datetime.now().strftime('%H:%M:%S')}] No files found in {base_path}") + return + + for file_name in files: + source = os.path.join(base_path, file_name) + file_ext = os.path.splitext(file_name)[1] + category = get_category(file_ext) + target_folder = os.path.join(base_path, category) + create_folder(target_folder) + + try: + shutil.move(source, os.path.join(target_folder, file_name)) + print(f"[{datetime.now().strftime('%H:%M:%S')}] Moved: {file_name} -> {category}/") + except Exception as e: + print(f"[{datetime.now().strftime('%H:%M:%S')}] Error moving {file_name}: {e}") + + +def main() -> None: + """Parse command-line arguments and execute the file organizer.""" + parser = argparse.ArgumentParser( + description="Organize files in a directory into categorized subfolders." + ) + parser.add_argument( + "--path", + required=True, + help="Directory path to organize." + ) + parser.add_argument( + "--interval", + type=int, + default=0, + help="Interval (in minutes) to repeat automatically (0 = run once)." + ) + args = parser.parse_args() + + if not os.path.exists(args.path): + print(f"Path not found: {args.path}") + return + + print(f"Watching directory: {args.path}") + print("Organizer started. Press Ctrl+C to stop.\n") + + try: + while True: + organize_files(args.path) + if args.interval == 0: + break + print(f"Waiting {args.interval} minutes before next run...\n") + time.sleep(args.interval * 60) + except KeyboardInterrupt: + print("\nOrganizer stopped by user.") + + +if __name__ == "__main__": + main()