## 경로(Path) 이해하기
### 절대 경로 vs 상대 경로
`os.path` 모듈은 파일 시스템 경로를 조작하는 다양한 함수를 제공합니다.
절대 경로는 루트 디렉토리부터 시작하는 전체 경로입니다:
```
# Windows
C:\Users\username\Documents\project\files
# Linux/Mac
/home/username/Documents/project/files
```
상대 경로는 현재 작업 디렉토리(`os.getcwd()`로 확인 가능) 기준의 경로입니다:
```python
# 현재 디렉토리 기준
"files/data.txt"
"./files/data.txt" # ./ 는 현재 디렉토리를 명시
"../files/data.txt" # ../ 는 상위 디렉토리
```
> [!WARNING]
> - Windows는 백슬래시(`\`), Unix 계열은 슬래시(`/`) 사용
> - Python에서는 슬래시(`/`)를 사용해도 자동 변환됨
> - 경로 조작은 `os.path.join()` 사용 권장
## 경로 존재 확인
`os.path.exists()`는 파일이나 디렉토리의 존재 여부를 확인합니다.
`os.path.isfile()`과 `os.path.isdir()`로 파일과 디렉토리를 구분할 수 있습니다.
```python
import os
path = "files"
if os.path.exists(path): # True/False 반환
print(f"{path} 경로가 존재합니다")
if os.path.isfile(path): # 파일이면 True
print("파일입니다")
elif os.path.isdir(path): # 디렉토리면 True
print("디렉토리입니다")
```
## 폴더 생성
### mkdir vs makedirs
`os.mkdir()`은 단일 디렉토리만, `os.makedirs()`는 중간 경로까지 모두 생성합니다.
```python
# mkdir: 부모 폴더 없으면 에러
os.mkdir('parent/child')
# makedirs: 부모 폴더도 함께 생성
os.makedirs('parent/child')
```
### exist_ok 옵션 활용
```python
# 안전한 폴더 생성 방법
os.makedirs(path, exist_ok=True)
# 1. exist_ok=True
# - 폴더 존재시 무시
# - 기존 내용 보존
# - 에러 없음
# 2. exist_ok=False (기본값)
# - 폴더 존재시 FileExistsError
```
## 경로 결합
`os.path.join()`은 여러 경로를 OS에 맞는 구분자로 결합합니다.
```python
import os
from typing import List
def save_images() -> List[str]:
paths = []
for i in range(3):
# OS에 맞는 구분자로 자동 변환
path = os.path.join("images", f"img_{i}.png")
paths.append(path)
# image 저장 로직 생략
...
return paths
# Windows: images\img_0.png
# Linux/Mac: images/img_0.png
```
## 디렉토리 탐색
### 기본 사용
`os.listdir()`은 지정된 경로의 하위 파일과 폴더명을 리스트로 반환합니다.
```python
# 둘 다 동일한 결과
files1 = os.listdir('files') # 끝에 / 없음
files2 = os.listdir('files/') # 끝에 / 있음
```
### 경로 시작 표현
```python
os.listdir('files') # 현재 디렉토리 /files 내용 반환
os.listdir('./files') # 동일: 현재 디렉토리 /files 내용 반환
```
> [!WARNING]
> - `listdir()`은 직계 항목만 반환(=바로 아래 항목만 반환)
> - 마침표(`./`)는 생략 가능
> - 끝의 슬래시(`/`)는 선택사항
### 예시 구조
```
project/
├── images/
│ ├── img_1.png
│ └── img_2.png
├── data/
│ └── user/
│ └── info.txt
└── main.py
# 예시 코드
os.listdir('images') # ['img_1.png', 'img_2.png']
os.listdir('data') # ['user']
```
## 유용한 경로 함수들
```python
# 현재 작업 디렉토리 반환
current = os.getcwd()
# 상대 경로를 절대 경로로 변환
abs_path = os.path.abspath('files')
# 경로에서 디렉토리 경로와 파일명 분리
dir_path = os.path.dirname('/path/to/file.txt') # /path/to
file_name = os.path.basename('/path/to/file.txt') # file.txt
```