반응형
📌 경로 생성 시 오류 없이 안전하게 처리하는 구조
실무에 바로 적용 가능한 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 어디서든 재사용 가능 |
반응형
'코딩취미 > Python' 카테고리의 다른 글
Python 프로젝트에서 폴더 관리 자동화 (0) | 2025.05.09 |
---|---|
Python psutil 라이브러리로 시스템 정보 수집 및 실시간 모니터링 만들기 (0) | 2025.05.03 |
Pandas 정렬 고급편: 다중 조건 정렬과 GroupBy 후 정렬 완전 정복 (0) | 2025.05.03 |
os.path.join에서 NoneType 오류가 발생하는 이유와 해결 방법 (0) | 2025.05.02 |
파이썬 리스트 vs Pandas vs NumPy 정렬 성능 비교 (0) | 2025.04.26 |