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) | |
| 폴더명 (folder_name) | Docs (config에서 매핑) |
| base_dir | /Users/username/Documents |
| target_dir | /Users/username/Documents/Docs |
| 최종 이동 경로 | /Users/username/Documents/Docs/test.pdf |
핵심 포인트
- 감지된 확장자에 따라 정리 기준을 찾고
- 그 폴더가 없다면 생성하고
- shutil.move()로 해당 위치로 이동시킴