실행 파일 (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
이 프로그램을 통해 단순한 자동화 스크립트를 넘어서, 실시간 감지, 구조화된 설계, 그리고 로그 추적까지 가능한 파일 정리 시스템을 구현할 수 있었다.
'File Organization' 카테고리의 다른 글
[Python] 파일 자동 정리 스크립트 3 (0) | 2025.07.10 |
---|---|
[Python] 파일 자동 정리 스크립트 2 (2) | 2025.07.10 |
[Python] 파일 자동 정리 스크립트 1 (0) | 2025.07.10 |