본문 바로가기
코딩취미/Python

경로 생성 시 오류 없이 안전하게 처리하는 구조

by 브링블링 2025. 5. 3.
반응형

📌 경로 생성 시 오류 없이 안전하게 처리하는 구조

실무에 바로 적용 가능한 pathlib 기반 경로 처리 + 예외 방지 가이드

 

파이썬 프로그램이나 GUI 애플리케이션에서 파일 경로나 폴더 경로를 다루는 일은 매우 흔합니다.
하지만 사용자 입력 실수, None 값, 특수 문자 등으로 인해 예상치 못한 오류가 자주 발생합니다.

 

이 글에서는 경로 생성 과정에서 발생할 수 있는 대표적인 문제들을 사전에 차단하고,
안전하고 확장 가능한 경로 처리 구조를 만드는 실전 전략을 예제와 함께 안내합니다.


✅ 왜 경로 처리가 중요한가?

예시 1 – NoneType 오류

os.path.join(None, "subdir")  
# → TypeError: expected str, bytes or os.PathLike object, not NoneType

예시 2 – 잘못된 문자로 인한 폴더 생성 실패

folder = "Project:Final"  
os.makedirs(folder)  
# → WindowsError: The filename, directory name, or volume label syntax is incorrect

 

이런 문제는 단순해 보여도 사용자의 입력에 따라 발생하며, 서비스 전체의 안정성이나 사용자 신뢰도에 영향을 줄 수 있습니다.


🧩 안전한 경로 생성 구조: 5단계 전략


1. pathlib 사용하기 – 추천 이유

from pathlib import Path

base = Path("C:/Users/john")
full_path = base / "Documents" / "Project1"
  • / 연산자를 이용해 안전하게 경로 결합
  • 자동으로 OS에 맞는 경로 구분자를 사용
  • 파일 존재 여부, 생성 등 다양한 기능 내장

2. 사용자 입력 검증하기

def is_valid_path(value: str) -> bool:
    return isinstance(value, str) and value.strip() != ""
  • None, 빈 문자열, 공백 입력 방지
  • .strip()을 통해 공백만 입력된 경우도 처리

3. 잘못된 문자 제거하기

Windows에서는 <>:"/\|?* 등의 문자가 폴더명에 포함되면 오류가 발생합니다.

import re

def sanitize_folder_name(name: str) -> str:
    return re.sub(r'[<>:"/\\|?*]', '_', name)
 

예시:

sanitize_folder_name("Project:Final/2025")  
# 결과: Project_Final_2025
반응형

4. 경로 존재 여부 확인 후 자동 생성

def ensure_directory(path: Path) -> bool:
    try:
        path.mkdir(parents=True, exist_ok=True)
        return True
    except Exception as e:
        print(f"[경고] 폴더 생성 실패: {e}")
        return False
  • parents=True → 중간 경로까지 생성
  • exist_ok=True → 이미 있으면 무시하고 진행

5. 전체 예제: 실전 경로 생성기

from pathlib import Path
import re

def is_valid_path(value: str) -> bool:
    return isinstance(value, str) and value.strip() != ""

def sanitize_folder_name(name: str) -> str:
    return re.sub(r'[<>:"/\\|?*]', '_', name)

def ensure_directory(path: Path) -> bool:
    try:
        path.mkdir(parents=True, exist_ok=True)
        return True
    except Exception as e:
        print(f"[에러] 폴더 생성 실패: {e}")
        return False

def create_project_path(base: str, version: str) -> Path | None:
    base = sanitize_folder_name(base)
    version = sanitize_folder_name(version)

    if is_valid_path(base) and is_valid_path(version):
        path = Path(base) / "ProjectFiles" / version
        if ensure_directory(path):
            print(f"[성공] 경로 생성됨: {path}")
            return path
        else:
            print("[실패] 폴더 생성에 실패했습니다.")
    else:
        print("[입력 오류] 경로 입력이 잘못되었습니다.")
    return None

🔐 실전 팁: 확장성 고려

기능 방법
경로 선택 다이얼로그 PySide6 QFileDialog.getExistingDirectory()
파일 저장 다이얼로그 QFileDialog.getSaveFileName()
로그 저장 경로 자동 생성 Path.cwd() / 'logs' / datetime.now().strftime('%Y%m%d')
 

✅ 마무리 요약

체크포인트 설명
pathlib 사용 안전하고 간결한 경로 조합 가능
입력값 검증 None과 빈 값으로 인한 예외 방지
잘못된 문자 정리 OS 제한 문자 제거로 안전한 이름 생성
폴더 자동 생성 .mkdir(parents=True)로 자동 구성
유지보수성 향상 GUI, CLI 어디서든 재사용 가능
반응형