File Organization

[Python] 파일 자동 정리 스크립트 3

devjingood 2025. 7. 10. 18:44

환경 설정

먼저 프로그램을 만들 디렉토리에 필요한 환경을 구성하기 위한 준비를 했다.

# 가상환경 생성
python3 -m venv venv

# 가상환경 활성화
source venv/bin/activate

# 필요한 외부 라이브러리 설치
pip install watchdog

 

config.py - 확장자에 따른 정리 기준

자동 정리기의 핵심은 파일 확장자별로 어떤 폴더로 이동시킬지 기준을 세우는 것이다.
이를 위해 딕셔너리 형태로 규칙을 정의해두었다.

  • 키는 파일 확장자, 값은 해당 확장자를 이동시킬 폴더 이름
  • 딕셔너리로 구성했기 때문에 나중에 유지보수가 매우 용이
  • DEFAULT_FOLDER는 확장자가 등록되어 있지 않은 파일이 생겼을 때의 기본 정리 폴더
  • 확장자 분류 예외를 방지하기 위해, 모든 확장자명을 '.확장자명' 형태로작성
# config.py

EXTENSION_MAP = {
    '.hwp': 'Docs',
    '.doc': 'Docs',
    '.docx': 'Docs',
    '.pdf': 'Docs',
    '.ppt': 'Presentations',
    '.pptx': 'Presentations',
    '.jpg': 'Imgs',
    '.jpeg': 'Imgs',
    '.png': 'Imgs',
    '.gif': 'Imgs',
    '.txt': 'Texts',
    '.zip': 'Archives',
    '.mp3': 'MV',
    '.mp4': 'MV',
}

DEFAULT_FOLDER = 'Others'

 

 

handler.py - 감지된 파일을 분류하여 이동시키는 로직

watchdog이 감지한 이벤트에 따라 어떤 작업을 수행할지를 정의하는 부분이다.
FileSystemEventHandler를 상속받아, 파일이 생성될 때(on_created) 작동하도록 구현했다.

import os
import shutil
from watchdog.events import FileSystemEventHandler
from config import EXTENSION_MAP, DEFAULT_FOLDER

class FileEventHandler(FileSystemEventHandler):
    def on_created(self, event):
        # event가 디렉토리일 시 무시 처리
        if event.is_directory:
            return
        
        # 확장자명 추출 (.jpg, .pdf 등등)
        _, ext = os.path.splitext(event.src_path) # event.src_path: 새로 생성된 파일의 전체 경로
        ext = ext.lower()

        # config.py에서 지정한 이동할 폴더명 결정
        folder_name = EXTENSION_MAP.get(ext, DEFAULT_FOLDER)

        base_dir = os.path.dirname(event.src_path) # 파일이 생성된 상위 폴더의 경로
        target_dir = os.path.join(base_dir, folder_name) # 해당 확장자에 맞는 정리 대상 폴더의 전체 경로
        # 예시: 확장자가 .pdf 면 folder_name = 'Docs' -> target_dir = ".../Docs"

        # 폴더가 없으면 생성
        if not os.path.exists(target_dir):
            os.makedirs(target_dir)
        
        # 파일 이동
        try:
            shutil.move(
                event.src_path,
                os.path.join(target_dir, os.path.basename(event.src_path))
            )
            print(f"[Moved] {event.src_path} -> {target_dir}/")
        except Exception as e:
            print(f"[Error] Failed to move file: {e}")

 

흐름 설명 예시

감지된 파일 (event.src_path) /Users/username/Documents/test.pdf
확장자 (ext) .pdf
폴더명 (folder_name) Docs (config에서 매핑)
base_dir /Users/username/Documents
target_dir /Users/username/Documents/Docs
최종 이동 경로 /Users/username/Documents/Docs/test.pdf

 

핵심 포인트

 

  • 감지된 확장자에 따라 정리 기준을 찾고
  • 그 폴더가 없다면 생성하고
  • shutil.move()로 해당 위치로 이동시킴