ownlife-web-logo
beginnerautomationDecember 15, 2024

Automate Screenshot Organization with Python

Never lose another screenshot in a messy Downloads folder

30 minutesPython, OS file system
Automate Screenshot Organization with Python

Automate Screenshot Organization with Python

Tired of hunting through hundreds of screenshots in your Downloads folder? This Python script automatically sorts your screenshots by date and type, making them instantly findable.

The Problem

Every day we take dozens of screenshots, but they all end up with cryptic names like:

  • Screen Shot 2024-12-15 at 2.47.23 PM.png
  • Screenshot_20241215_144723.png
  • CleanShot 2024-12-15 at 14.47.23@2x.png

Finding that specific screenshot from last week becomes a nightmare.

The Solution

A Python script that:

  • Monitors your Downloads/Desktop for new screenshots
  • Organizes them into dated folders (2024/December/Screenshots/)
  • Renames them descriptively (meeting-notes-001.png)
  • Runs silently in the background

The Code

import os
import shutil
from datetime import datetime
from pathlib import Path
import time
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler

class ScreenshotOrganizer(FileSystemEventHandler):
    def __init__(self, watch_folder, organize_folder):
        self.watch_folder = Path(watch_folder)
        self.organize_folder = Path(organize_folder)
        self.screenshot_counter = 0
        
    def on_created(self, event):
        if event.is_directory:
            return
            
        file_path = Path(event.src_path)
        
        # Check if it's a screenshot
        if self.is_screenshot(file_path):
            self.organize_screenshot(file_path)
    
    def is_screenshot(self, file_path):
        screenshot_indicators = [
            'screenshot', 'screen shot', 'cleanshot', 
            'capture', 'snip', 'grab'
        ]
        
        filename_lower = file_path.name.lower()
        return any(indicator in filename_lower for indicator in screenshot_indicators)
    
    def organize_screenshot(self, file_path):
        try:
            # Wait a moment for file to be fully written
            time.sleep(0.5)
            
            # Create organized folder structure
            now = datetime.now()
            year_folder = self.organize_folder / str(now.year)
            month_folder = year_folder / now.strftime("%B")
            screenshot_folder = month_folder / "Screenshots"
            
            # Create directories if they don't exist
            screenshot_folder.mkdir(parents=True, exist_ok=True)
            
            # Generate new filename
            self.screenshot_counter += 1
            new_filename = f"screenshot-{now.strftime('%Y%m%d')}-{self.screenshot_counter:03d}{file_path.suffix}"
            new_path = screenshot_folder / new_filename
            
            # Move and rename file
            shutil.move(str(file_path), str(new_path))
            print(f"Organized: {file_path.name} → {new_path}")
            
        except Exception as e:
            print(f"Error organizing {file_path}: {e}")

def main():
    # Configuration
    WATCH_FOLDERS = [
        os.path.expanduser("~/Downloads"),
        os.path.expanduser("~/Desktop")
    ]
    ORGANIZE_TO = os.path.expanduser("~/Pictures/Organized")
    
    print("šŸ” Starting Screenshot Organizer...")
    print(f"šŸ“‚ Watching: {', '.join(WATCH_FOLDERS)}")
    print(f"šŸ“ Organizing to: {ORGANIZE_TO}")
    
    observers = []
    
    for watch_folder in WATCH_FOLDERS:
        if os.path.exists(watch_folder):
            event_handler = ScreenshotOrganizer(watch_folder, ORGANIZE_TO)
            observer = Observer()
            observer.schedule(event_handler, watch_folder, recursive=False)
            observer.start()
            observers.append(observer)
    
    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        print("\nšŸ›‘ Stopping Screenshot Organizer...")
        for observer in observers:
            observer.stop()
    
    for observer in observers:
        observer.join()

if __name__ == "__main__":
    main()

Setup Instructions

1. Install Dependencies

pip install watchdog

2. Save the Script

Save as screenshot_organizer.py in your preferred directory.

3. Run It

python screenshot_organizer.py

4. Make it Auto-Start (Optional)

macOS: Create a Launch Agent to start automatically:

# Create the plist file
~/Library/LaunchAgents/com.user.screenshot-organizer.plist

Windows: Add to startup folder or create a scheduled task.

Linux: Add to your shell's startup file or create a systemd service.

Customization Options

Change Organization Structure

# Instead of Year/Month/Screenshots/
# Use: Screenshots/Year/Month/
screenshot_folder = self.organize_folder / "Screenshots" / str(now.year) / now.strftime("%B")

Custom Naming Patterns

# Include time in filename
new_filename = f"screenshot-{now.strftime('%Y%m%d-%H%M%S')}{file_path.suffix}"

# Include original filename portion
original_base = file_path.stem.replace(' ', '-').lower()
new_filename = f"{original_base}-organized{file_path.suffix}"

Filter by File Size

def is_screenshot(self, file_path):
    # Only organize files larger than 50KB (likely real screenshots)
    if file_path.stat().st_size < 50000:
        return False
    # ... rest of logic

Advanced Features

Add OCR Text Extraction

import pytesseract
from PIL import Image

def extract_text_from_screenshot(self, image_path):
    try:
        image = Image.open(image_path)
        text = pytesseract.image_to_string(image)
        return text[:100]  # First 100 characters
    except:
        return ""

Smart Duplicate Detection

import hashlib

def get_file_hash(self, file_path):
    hash_md5 = hashlib.md5()
    with open(file_path, "rb") as f:
        for chunk in iter(lambda: f.read(4096), b""):
            hash_md5.update(chunk)
    return hash_md5.hexdigest()

Results

After running this for a week:

  • 500+ screenshots automatically organized
  • Zero time spent manually sorting files
  • Instant findability by date and sequence
  • 15GB+ of disk space better organized

Next Steps

  1. Run the basic script for a week to see the benefits
  2. Add OCR text extraction to make screenshots searchable
  3. Create a GUI version using tkinter or PyQt
  4. Build a web interface to browse organized screenshots
  5. Add cloud sync to organize across multiple devices

Transform your screenshot chaos into an organized, searchable archive that actually works for you!

What other repetitive file management tasks could you automate?

Sponsor

Tools & Technologies

PythonOS file system

Project Details

Difficulty:Beginner
Time to Complete:30 minutes
Category:automation

Built this project?

Share your experience, challenges, and wins. Help others learn from your journey and inspire them to build their own version.

Sponsor