File Organization

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

devjingood 2025. 7. 10. 22:04

실행 파일 (auto_organizer.py) 구성

 

  • 감시할 폴더 경로 설정
  • 감지 핸들러와 연결
  • 감시 시작 및 종료 처리
  • 터미널 + 로그 파일에 모든 정보 출력 (logging)
  • 기존에는 print()로만 출력되던 정리 결과를
    logging 모듈을 활용해 파일(log_로그 저장 날짜.log)에 저장되도록 설정했다.
  • 덕분에 프로그램이 백그라운드에서 실행되더라도
    실제로 어떤 파일이 어떻게 정리되었는지 추적 가능하다.
# auto_organizer.py

import time
import logging
from datetime import datetime
from watchdog.observers import Observer
from handler import FileEventHandler

# 로그 설정 (터미널 + 파일 기록)
log_filename = datetime.now().strftime("log_%Y-%m-%d.log")
logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s [%(levelname)s] %(message)s",
    handlers=[
        logging.FileHandler(log_filename),
        logging.StreamHandler()
    ]
)


if __name__ == "__main__":
    # 감시할 폴더 경로 (변경 가능)
    path_to_watch = "폴더 경로"

    # 이벤트 핸들러와 Observer 생성
    event_handler = FileEventHandler()
    observer = Observer()
    observer.schedule(event_handler, path=path_to_watch, recursive=False)

    # 감시 시작
    observer.start()
    logging.info(f"[Started] Watching folder: {path_to_watch}")

    try:
        while True:
            time.sleep(1) # 계속 감시 유지
    except KeyboardInterrupt: # Ctrl + C로 종료
        # 종료 시 처리
        observer.stop()
        logging.info("\n[Stopped] File watcher terminated.")
    
    observer.join()

 

 

안정성 보완 - wait_until_ready()

한꺼번에 수십 ~ 수백 개의 파일이 들어오는 경우, 파일이 복사 완료되기 전에 이동이 시도될 수 있어 오류가 발생할 수 있다.

이를 해결하기 위해 wait_until_ready() 함수를 handler_utils.py에 따로 정의했다.
이 함수는 일정 시간 동안 파일 크기가 변하지 않으면 복사 완료로 간주하고 이후 처리를 진행한다.

이 함수는 handler.py의 on_created() 안에서 사용된다.

# handler_utils.py

import time
import os

def wait_until_ready(filepath, timeout=5, check_interval=1):
    # 파일 크기가 일정 시간 동안 변하지 않으면 준비 완료로 간주
    prev_size = -1

    for _ in range(timeout):
        try:
            curr_size = os.path.getsize(filepath)
        except FileNotFoundError:
            # 아직 복사 중이라 파일이 잠깐 사라진 경우
            time.sleep(check_interval)
            continue

        if curr_size == prev_size:
            return True
        
        prev_size = curr_size
        time.sleep(check_interval)
    
    return False # 시간 초과: 여전히 파일 크기 변화 중

 

handler.py 수정 - wait_until_ready 함수 호출

# handler.py

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

class FileEventHandler(FileSystemEventHandler):
    def on_created(self, event):
        # event가 디렉토리일 시 무시 처리
        if event.is_directory:
            return
        
        if not wait_until_ready(event.src_path):
            logging.info(f"[Skipped] File not ready: {event.src_path}")
            return
            
        # 이하 동일

 

전체 프로젝트 흐름

1. config.py -> 확장자 기준 정의

2. handler.py -> 이벤트 감지 시 정리 로직 실행

3. handler_utils.py -> 복사 중인 파일 안정성 확보

4. auto_organizer.py -> 모든 구성 연결 및 실행

5. logging -> 로그 파일 저장 + 터미널 출력

# 실행
python auto_organizer.py

 

이 프로그램을 통해 단순한 자동화 스크립트를 넘어서, 실시간 감지, 구조화된 설계, 그리고 로그 추적까지 가능한 파일 정리 시스템을 구현할 수 있었다.