Windows · Python 3.12.4. 본문의 첫 예제를 실행하여 표준 출력과 예상 결과가 일치함을 확인했습니다. 연습문제의 모든 입력을 검증한 것은 아닙니다.
이 글의 순서 4개 단락
Python에서 ~/Documents를 경로로 쓰면 홈 디렉터리 아래의 Documents를 가리킬 것처럼 보입니다. 하지만 Path는 이 문자열을 만들 때 ~를 자동으로 확장하지 않습니다. Python 3.12에서 준비된 파일 없이 두 경로를 비교해 보겠습니다.
물결표가 포함된 경로 비교하기
이 예제에는 별도 입력이 없습니다. 실제 파일을 열거나 파일의 존재 여부를 확인하지 않고, 경로 객체의 구성만 비교합니다.
from pathlib import Path
original = Path('~/Documents')
expanded = original.expanduser()
home = Path.home()
print('원래 첫 부분:', original.parts[0])
print('원래 경로는 상대 경로:', not original.is_absolute())
print('확장 경로는 홈 아래 Documents:', expanded == home / 'Documents')
print('확장 전후가 같은 경로:', original == expanded)

예상 표준 출력은 다음과 같습니다. 홈 디렉터리를 확인할 수 있는 일반적인 환경을 기준으로 합니다.
원래 첫 부분: ~
원래 경로는 상대 경로: True
확장 경로는 홈 아래 Documents: True
확장 전후가 같은 경로: False
original의 첫 부분은 홈 경로가 아니라 문자 그대로 ~입니다. 반면 expanduser()는 맨 앞의 ~를 현재 사용자의 홈 디렉터리로 바꾼 새 경로를 반환합니다. 원래 객체는 바뀌지 않으므로 반환값을 변수에 담거나 Path('~/Documents').expanduser()처럼 이어서 사용해야 합니다.
작업 폴더와 홈 디렉터리는 어떻게 다를까?
이전에 살펴본 작업 폴더 기준 상대 경로에서는 Path('Documents')를 현재 작업 디렉터리 아래의 Documents로 해석합니다. Path.cwd()로 그 기준을 확인할 수 있습니다. Path('~/Documents')도 확장하기 전에는 상대 경로이므로, 파일에 접근하면 현재 작업 디렉터리 아래의 ~라는 이름의 폴더부터 찾습니다.
홈 기호 확장은 다른 작업입니다. Path('~/Documents').expanduser()는 현재 작업 폴더 대신 홈 디렉터리를 기준으로 경로를 만듭니다. 실제 환경에서 두 기준과 확장된 경로를 확인하려면 다음을 실행하세요. 출력되는 경로는 사용자와 운영체제에 따라 달라집니다.
from pathlib import Path
print('현재 작업 폴더:', Path.cwd())
print('홈 디렉터리:', Path.home())
print('확장된 경로:', Path('~/Documents').expanduser())
예를 들어 홈 디렉터리가 /home/min인 Linux 환경에서는 확장 결과가 /home/min/Documents이고, 홈 디렉터리가 C:\Users\min인 Windows 환경에서는 C:\Users\min\Documents 형태입니다. 이는 경로 예시이며 실제 값은 직접 확인해야 합니다. Windows의 Documents가 홈 아래에 항상 존재한다는 뜻도 아닙니다.
확장한 뒤에도 파일이 없다면
expanduser()는 경로를 바꿀 뿐 파일이나 폴더를 만들지 않습니다. 홈 경로가 올바르게 확장되었더라도 Documents 또는 그 안의 파일이 실제로 없으면 열 수 없습니다. 사용하려는 파일에 대해 확장 결과를 출력한 다음 is_file()로 확인해 보세요.
from pathlib import Path
path = Path('~/Documents/example.txt').expanduser()
print('확인할 경로:', path)
print('일반 파일인가:', path.is_file())
이 출력은 각자의 파일 상태에 따라 달라집니다. False라면 경로가 잘못되었거나 파일이 없을 수 있습니다. 이름과 확장자, 실제 저장 위치를 확인하세요. is_file()은 디렉터리에도 False를 반환하며, 접근 권한 등으로 확인 자체가 실패할 수도 있습니다. 확인 직후 파일이 바뀔 수도 있으므로 실제로 열 때는 FileNotFoundError와 PermissionError 등도 처리해야 합니다.
또한 홈 디렉터리를 알아낼 수 없는 환경에서는 Path.home()이나 expanduser()가 RuntimeError를 발생시킬 수 있습니다. ~가 경로의 맨 앞 구성 요소가 아닌 경우에는 홈 기호로 확장되지 않습니다.
연습: 홈 아래 다른 경로 만들기
~/Documents/notes.txt를 홈 디렉터리 기준으로 확장하고, 그 결과가 Path.home()에 Documents, notes.txt를 차례로 붙인 경로와 같은지 출력해 보세요. 파일이 존재할 필요는 없습니다.
풀이
from pathlib import Path
path = Path('~/Documents/notes.txt').expanduser()
expected = Path.home() / 'Documents' / 'notes.txt'
print(path == expected)
홈 디렉터리를 확인할 수 있다면 예상 출력은 True입니다. 이 비교는 두 경로의 구성만 확인하므로 notes.txt가 실제로 있는지는 알려 주지 않습니다.
CHECK THE SOURCE
참고한 공식 문서
- Python 3.12 pathlib — Object-oriented filesystem paths ↗
- Python 3.12 os.path — Common pathname manipulations ↗
기능 설명은 위 문서를 참고했으며, 예제의 입력·결과와 한계는 본문에 따로 기록했습니다.