π― Project Objective
To create an advanced File Organizer that automatically scans folders, classifies files by type, renames duplicates, logs actions, and can run on a schedule for continuous cleanup.
π§© Skills Youβll Learn
- File handling with
osandshutil - Pattern matching using
fnmatchandre - Logging and reporting
- Exception handling and automation
- Scheduling cleanups with
schedule - Building modular, maintainable code
βοΈ Technology Stack
| Library | Purpose |
|---|---|
os, shutil | File and directory operations |
re, fnmatch | Pattern matching for file extensions |
time, datetime | Scheduling and timestamps |
logging | Tracking all actions performed |
pandas (optional) | Generating CSV reports |
schedule (optional) | Automate periodic cleanups |
π§ Auto-Install Dependencies
import subprocess, sys
def install(package):
try:
__import__(package)
except ImportError:
subprocess.check_call([sys.executable, "-m", "pip", "install", package])
for pkg in ["pandas", "schedule"]:
install(pkg)
π Step 1 β Directory Setup
Create categorized folders automatically (if not present):
import os
TARGET_DIR = "C:/Users/YourName/Downloads"
CATEGORIES = {
"Images": [".jpg", ".jpeg", ".png", ".gif", ".bmp"],
"Documents": [".pdf", ".docx", ".txt", ".xlsx", ".pptx"],
"Videos": [".mp4", ".mov", ".avi", ".mkv"],
"Music": [".mp3", ".wav", ".aac"],
"Archives": [".zip", ".rar", ".tar"],
"Programs": [".exe", ".msi"],
"Scripts": [".py", ".js", ".html", ".css"]
}
for folder in CATEGORIES.keys():
path = os.path.join(TARGET_DIR, folder)
if not os.path.exists(path):
os.makedirs(path)
β Creates subfolders like βImagesβ, βDocumentsβ, etc.
βοΈ Step 2 β Smart File Sorting Function
import shutil, re
from datetime import datetime
def organize_files():
log_entries = []
for file_name in os.listdir(TARGET_DIR):
file_path = os.path.join(TARGET_DIR, file_name)
if os.path.isfile(file_path):
ext = os.path.splitext(file_name)[1].lower()
moved = False
for category, extensions in CATEGORIES.items():
if ext in extensions:
dest = os.path.join(TARGET_DIR, category)
new_name = rename_if_duplicate(dest, file_name)
shutil.move(file_path, os.path.join(dest, new_name))
moved = True
log_entries.append((file_name, category, datetime.now()))
break
if not moved:
log_entries.append((file_name, "Uncategorized", datetime.now()))
return log_entries
π§© Step 3 β Handle Duplicate File Names
def rename_if_duplicate(dest, file_name):
base, ext = os.path.splitext(file_name)
counter = 1
new_name = file_name
while os.path.exists(os.path.join(dest, new_name)):
new_name = f"{base}_{counter}{ext}"
counter += 1
return new_name
β
Automatically renames duplicates like photo_1.jpg, photo_2.jpg, etc.
π§Ύ Step 4 β Logging Actions
import logging
logging.basicConfig(
filename="file_organizer.log",
level=logging.INFO,
format="%(asctime)s - %(levelname)s - %(message)s"
)
def log_activity(entries):
for file, category, timestamp in entries:
logging.info(f"Moved: {file} β {category}")
π Step 5 β Generate CSV Report
import pandas as pd
def export_report(entries):
df = pd.DataFrame(entries, columns=["File", "Category", "Timestamp"])
df.to_csv("organizer_report.csv", index=False)
print("β
Report saved as 'organizer_report.csv'")
π Step 6 β Automate Organization Periodically
import schedule, time
def job():
print("Running file organizer...")
entries = organize_files()
log_activity(entries)
export_report(entries)
# Run every 10 minutes
schedule.every(10).minutes.do(job)
while True:
schedule.run_pending()
time.sleep(1)
β Your computer now auto-organizes files every 10 minutes.
π§± Full Combined Code (Advanced Organizer)
import os, shutil, logging, pandas as pd, schedule, time
from datetime import datetime
TARGET_DIR = "C:/Users/YourName/Downloads"
CATEGORIES = {
"Images": [".jpg", ".jpeg", ".png", ".gif", ".bmp"],
"Documents": [".pdf", ".docx", ".txt", ".xlsx", ".pptx"],
"Videos": [".mp4", ".mov", ".avi", ".mkv"],
"Music": [".mp3", ".wav", ".aac"],
"Archives": [".zip", ".rar", ".tar"],
"Programs": [".exe", ".msi"],
"Scripts": [".py", ".js", ".html", ".css"]
}
for folder in CATEGORIES.keys():
os.makedirs(os.path.join(TARGET_DIR, folder), exist_ok=True)
logging.basicConfig(filename="file_organizer.log", level=logging.INFO, format="%(asctime)s - %(message)s")
def rename_if_duplicate(dest, file_name):
base, ext = os.path.splitext(file_name)
counter = 1
new_name = file_name
while os.path.exists(os.path.join(dest, new_name)):
new_name = f"{base}_{counter}{ext}"
counter += 1
return new_name
def organize_files():
log_entries = []
for file_name in os.listdir(TARGET_DIR):
file_path = os.path.join(TARGET_DIR, file_name)
if os.path.isfile(file_path):
ext = os.path.splitext(file_name)[1].lower()
moved = False
for category, extensions in CATEGORIES.items():
if ext in extensions:
dest = os.path.join(TARGET_DIR, category)
new_name = rename_if_duplicate(dest, file_name)
shutil.move(file_path, os.path.join(dest, new_name))
log_entries.append((file_name, category, datetime.now()))
moved = True
break
if not moved:
log_entries.append((file_name, "Uncategorized", datetime.now()))
return log_entries
def log_activity(entries):
for file, category, timestamp in entries:
logging.info(f"Moved {file} β {category}")
def export_report(entries):
df = pd.DataFrame(entries, columns=["File", "Category", "Timestamp"])
df.to_csv("organizer_report.csv", index=False)
def job():
entries = organize_files()
log_activity(entries)
export_report(entries)
print(f"β
Organized at {datetime.now()}")
schedule.every(10).minutes.do(job)
while True:
schedule.run_pending()
time.sleep(1)
π‘ Optional Enhancements
| Feature | Description |
|---|---|
| ποΈ Trash Manager | Move deleted files to a βRecycle Binβ |
| π Duplicate Detector | Use file hashes to detect duplicates |
| π§ AI File Sorting | Use NLP to auto-categorize based on filenames |
| π§° GUI Interface | Add a Tkinter dashboard for manual control |
| βοΈ Cloud Sync | Auto-sync organized files to Google Drive / Dropbox |
π§ Learning Outcomes
β
File handling and directory traversal
β
Automated file management
β
Logging and reporting
β
Scheduling with Python
β
Writing professional, modular code

Leave a Reply