[Python Path 완전 가이드] os.path와 pathlib 모듈 활용법

目次

1. Python Path의 개요와 중요성

Python에서 파일 경로 관리의 기본

Python에서의 “경로”는 파일이나 폴더의 위치를 지정하기 위한 길이며, 컴퓨터 파일 시스템에서 중요한 역할을 합니다. 예를 들어, 특정 디렉터리 안에 있는 파일을 열 때나 프로그램에서 파일을 조작할 때 경로가 올바르게 설정되지 않으면 오류가 발생합니다. 따라서 경로를 다루는 방법을 이해하는 것은 프로그래밍의 기본적인 스킬 중 하나라고 할 수 있습니다. Python에서는 파일 경로를 처리하기 위해 여러 모듈이 제공됩니다. 그 중 대표적인 것이 os.path 모듈과 pathlib 모듈입니다. 이를 올바르게 사용함으로써 효율적인 파일 작업과 서로 다른 운영 체제 간의 호환성을 확보할 수 있습니다.

절대 경로와 상대 경로

경로는 크게 “절대 경로”와 “상대 경로”로 나뉩니다.
  • 절대 경로는 시스템 루트 디렉터리부터의 완전한 경로를 가리키며, 어떤 디렉터리에서 접근하든 목적 파일이나 폴더에 도달할 수 있습니다. 예를 들어, Windows에서는 C:UsersYourNameDocumentsfile.txt와 같은 형식으로 지정합니다.
  • 상대 경로는 현재 작업 디렉터리(현재 디렉터리)로부터의 상대적인 위치를 나타냅니다. 예를 들어, 현재 디렉터리가 C:UsersYourName인 경우, 상대 경로로 Documentsfile.txt라고 적으면 같은 파일에 접근할 수 있습니다.

Python에서 경로 관리의 중요성

Python에서 파일을 조작할 때, 플랫폼마다 다른 경로 차이를 흡수하면서 정확한 파일 경로를 다루는 것은 매우 중요합니다. 예를 들어, Windows에서는 경로 구분자가 “\”이고, Linux나 macOS에서는 “/”가 사용됩니다. os.pathpathlib 모듈은 이러한 차이를 의식하지 않고도 프로그램을 작성할 수 있도록 지원하며, 크로스 플랫폼에서 동작하는 스크립트 작성이 용이해집니다.

2. 기본 Path 조작: os.path 모듈

os.path 모듈이란

os.path 모듈은 Python 표준 라이브러리의 일부이며, 파일 및 디렉터리 경로를 조작하기 위한 편리한 기능을 제공합니다. 이 모듈은 파일 존재 확인, 경로 결합, 파일명 가져오기 등 일상적인 경로 작업을 쉽게 수행할 수 있는 기본 도구를 갖추고 있습니다. 또한, 서로 다른 운영 체제(Windows, Linux, macOS) 간의 경로 구분자 차이를 자동으로 처리하여 크로스 플랫폼 개발을 지원합니다.

주요 함수

os.path.exists()로 파일 및 디렉터리 존재 확인

os.path.exists()는 지정된 경로가 존재하는지 확인하는 데 사용됩니다. 이 함수는 파일이나 디렉터리가 존재하면 True를 반환하고, 존재하지 않으면 False를 반환합니다. 예를 들어, 다음과 같이 사용합니다.
import os

path = "/path/to/file.txt"

if os.path.exists(path):
    print("파일이 존재합니다.")
else:
    print("파일이 존재하지 않습니다.")

os.path.join()으로 경로 결합

os.path.join()은 여러 경로를 올바르게 결합하기 위한 함수입니다. 서로 다른 플랫폼별 구분자 차이를 고려하여 OS에 맞는 올바른 경로 형식으로 결합해 주므로, 문자열을 직접 결합하는 수고를 줄일 수 있습니다. 아래는 os.path.join()을 사용하여 디렉터리와 파일명을 결합하는 예시입니다.
import os

dir_path = "/path/to/directory"
file_name = "file.txt"

full_path = os.path.join(dir_path, file_name)
print(full_path)  # /path/to/directory/file.txt

os.path.basename()와 os.path.dirname()으로 파일명과 디렉터리명 가져오기

os.path.basename()은 경로에서 파일명을 가져오는 데 사용되고, os.path.dirname()은 경로에서 디렉터리명을 가져옵니다. 예를 들어, 다음과 같이 사용합니다.
import os

path = "/path/to/directory/file.txt"

file_name = os.path.basename(path)
dir_name = os.path.dirname(path)

print(file_name)  # file.txt
print(dir_name)   # /path/to/directory

os.path 모듈 사용 예시

다음은 os.path 모듈을 사용하여 파일 존재 확인, 경로 결합, 파일명 및 디렉터리명 가져오기를 수행하는 예시입니다.
import os

# 경로 결합
base_dir = "/user/local"
file_name = "example.txt"
full_path = os.path.join(base_dir, file_name)

# 파일 존재 확인
if os.path.exists(full_path):
    print(f"{full_path}은 존재합니다.")
else:
    print(f"{full_path}은 존재하지 않습니다.")

# 파일명과 디렉터리명 가져오기
print("파일명:", os.path.basename(full_path))
print("디렉터리명:", os.path.dirname(full_path))
侍エンジニア塾

3. 진화된 Path 조작: pathlib 모듈

pathlib 모듈 개요

pathlib 모듈은 Python 3.4부터 도입된, 파일 시스템 경로를 객체 지향적으로 다루기 위한 모듈입니다. 기존의os.path 모듈에서는 경로를 문자열로 다루고 함수를 조합해 조작했지만, pathlib은 경로 자체를 객체로 다루어 직관적으로 경로를 조작할 수 있도록 설계되었습니다. 이를 통해 Python 코드가 더 읽기 쉽고 유지보수가 쉬워집니다.

pathlib의 기본 사용법

경로 생성 및 결합

pathlib에서는 경로가Path 객체로 다루어집니다. 경로 생성은 매우 간단하며, 다음과 같이Path 클래스를 사용합니다.
from pathlib import Path

# 경로 생성
path = Path("/user/local/example.txt")
print(path)
또한, 경로 결합에는/ 연산자를 사용할 수 있습니다. 이 방법은os.path.join()에 해당하지만, 더 간결하고 직관적입니다.
from pathlib import Path

# 경로 결합
base_dir = Path("/user/local")
file_name = "example.txt"
full_path = base_dir / file_name
print(full_path)  # /user/local/example.txt

파일 및 디렉터리 존재 확인

pathlib에서는 파일이나 디렉터리의 존재를 확인할 때exists() 메서드를 사용합니다. os.path.exists()와 동일한 기능이지만 객체 지향 방식으로 조작할 수 있습니다. 또한 디렉터리인지 파일인지 확인하려면is_file()이나is_dir()을 사용합니다.
from pathlib import Path

path = Path("/user/local/example.txt")

if path.exists():
    print("파일 또는 디렉터리가 존재합니다.")

if path.is_file():
    print("이것은 파일입니다.")

if path.is_dir():
    print("이것은 디렉터리입니다.")

절대 경로와 상대 경로 조작

pathlib을 사용하면, 절대 경로와 상대 경로를 쉽게 다룰 수 있습니다. 예를 들어, 상대 경로를 절대 경로로 변환하려면resolve() 메서드를 사용합니다.
from pathlib import Path

relative_path = Path("example.txt")
absolute_path = relative_path.resolve()
print(absolute_path)  # /full/path/to/example.txt
반대로, 절대 경로를 상대 경로로 변환하려면relative_to() 메서드를 사용합니다. 이를 통해 특정 기준으로부터의 상대 경로를 얻을 수 있습니다.
from pathlib import Path

absolute_path = Path("/user/local/example.txt")
relative_path = absolute_path.relative_to("/user")
print(relative_path)  # local/example.txt

pathlib의 편리함

pathlib의 가장 큰 장점은 그 객체 지향적인 사용법입니다. 이를 통해 코드가 더 직관적이 되고, 경로 조작을 위해 여러 함수를 외울 필요가 없어집니다. 또한, os.path 모듈과 달리, pathlib은 크로스 플랫폼 지원이 더욱 강화되어, 서로 다른 OS 간의 호환성을 유지하면서도 간단한 코드로 처리를 할 수 있습니다.

4. 환경 변수 PYTHONPATH 활용법

PYTHONPATH란?

PYTHONPATH는, Python이 모듈이나 패키지를 검색할 때 사용하는 환경 변수입니다. 일반적으로 Python은 표준 라이브러리와 설치된 패키지를 sys.path에 기반해 찾지만, PYTHONPATH를 설정함으로써 특정 디렉터리를 우선적으로 검색할 수 있습니다. 이 기능을 통해 프로젝트마다 다른 모듈이나 라이브러리를 사용하고 싶을 때나, 자체 모듈을 읽어들일 때 편리합니다.

PYTHONPATH 설정 방법

명령줄에서 설정

명령줄에서 일시적으로 PYTHONPATH를 설정하는 방법은, 아래와 같습니다. PYTHONPATH에 추가하고 싶은 디렉터리를 지정하고, 그 후 Python 스크립트를 실행합니다.
  • Linux/macOS인 경우:
export PYTHONPATH=/path/to/directory:$PYTHONPATH
python script.py
  • Windows인 경우:
set PYTHONPATH=C:pathtodirectory;%PYTHONPATH%
python script.py
이 방법은 터미널을 닫으면 설정이 리셋되므로, 일시적인 사용에 적합합니다.

영구적인 설정

PYTHONPATH를 영구적으로 설정하고 싶을 경우는, 쉘 설정 파일에 기록하는 방법이 일반적입니다.
  • Linux/macOS인 경우: .bashrc.zshrc 등 쉘 설정 파일에 아래를 추가합니다.
  export PYTHONPATH=/path/to/directory:$PYTHONPATH
  • Windows인 경우: 환경 변수를 시스템 설정에서 추가합니다. “시스템 속성” → “환경 변수” → “사용자 환경 변수”에 PYTHONPATH를 추가하고 디렉터리 경로를 설정합니다.
이렇게 하면 터미널을 열 때마다 PYTHONPATH가 자동으로 설정됩니다.

PYTHONPATH 활용 예시

예를 들어, 프로젝트 내에서 여러 디렉터리에 걸쳐 모듈을 관리하고 있는 경우, PYTHONPATH를 설정함으로써 여러 모듈을 쉽게 임포트할 수 있게 됩니다. 다음과 같은 디렉터리 구조를 생각해 봅시다.
/my_project/
│
├── /src/
│   └── my_module.py
│
└── /lib/
    └── my_library.py
이 프로젝트에서 srclib를 모두 사용하고 싶다면, PYTHONPATHsrclib를 추가합니다.
export PYTHONPATH=/my_project/src:/my_project/lib
이렇게 하면 다음과 같이 두 모듈을 임포트할 수 있습니다.
from my_module import my_function
from my_library import my_library_function

주의점 및 베스트 프랙티스

PYTHONPATH를 설정할 때는 몇 가지 주의점이 있습니다. 예를 들어, 기존 PYTHONPATH에 중복된 경로가 있는 경우, 의도하지 않은 모듈이 임포트될 수 있습니다. 이를 피하려면 PYTHONPATH를 설정할 때 이미 설정된 값을 확인하고 적절히 관리해야 합니다.
echo $PYTHONPATH
또한, PYTHONPATH는 개발 환경에서 편리하지만, 운영 환경에서는 가능한 한 가상 환경(Virtualenv)이나 venv를 사용해 모듈 의존성을 개별적으로 관리하는 것이 권장됩니다. 이를 통해 서로 다른 프로젝트 간 의존성 충돌을 피할 수 있습니다.

5. os.path와 pathlib의 사용 구분

os.path와 pathlib의 차이

Python에는 파일 경로를 조작하기 위해 os.pathpathlib이라는 두 가지 주요 모듈이 있습니다. 각각의 모듈은 고유한 장점이 있으며, 사용 상황에 따라 구분해서 사용하는 것이 중요합니다.

os.path의 특징

os.path는 Python 2.x 시대부터 사용되어 온 전통적인 모듈로, 파일 및 디렉터리 경로를 조작하기 위한 기본 기능을 제공합니다. 파일 경로는 단순 문자열로 취급되므로 함수 기반으로 경로 결합 및 검사를 수행합니다. 아래는 os.path를 사용할 때의 주요 특징입니다.
  • 경량 및 간단함: os.path는 매우 간단하며, 적은 코드량으로 경로 조작이 가능합니다.
  • 크로스 플랫폼 지원: os.path는 Windows, Linux, macOS 등 다양한 운영 체제를 지원합니다.
  • 경로를 문자열로 조작: 경로를 문자열로 다루기 때문에 간단한 조작이 가능하지만, 대규모 프로젝트에서는 코드 복잡도가 증가할 수 있습니다.

pathlib의 특징

반면, pathlib은 Python 3.4 이후에 도입된 새로운 모듈로, 객체 지향적으로 경로 조작을 할 수 있습니다. 파일 경로는 Path 객체로 다루어지며, 직관적으로 경로 결합 및 검증이 가능합니다. 아래는 pathlib의 주요 특징입니다.
  • 객체 지향: pathlib에서는 경로를 객체로 조작할 수 있어 메서드 체인을 활용한 가독성 높은 코드를 작성할 수 있습니다.
  • 직관적인 연산자 사용: 경로 결합에 / 연산자를 사용함으로써 간단하고 직관적으로 경로 조작이 가능합니다.
  • 고기능 및 유연함: 복잡한 파일 시스템 조작에서도 pathlib은 다기능이며, 보다 간결한 코드를 작성할 수 있습니다.

사용 상황에 따른 선택

os.path가 적합한 경우

  1. 레거시 시스템이나 Python 2.x와의 호환성이 필요한 경우: os.path는 Python 2.x에서도 사용할 수 있어 오래된 프로젝트나 라이브러리와의 호환성이 필요한 경우에 적합합니다.
  2. 간단한 스크립트나 소규모 프로젝트: 문자열 기반으로 경로 조작만 하면 충분한 경우, os.path는 경량이고 효율적입니다.

pathlib이 적합한 경우

  1. Python 3.x에서의 신규 프로젝트: Python 3.4 이후 환경이라면 pathlib을 사용해 보다 직관적이고 유지보수성이 높은 코드를 작성할 수 있습니다.
  2. 복잡한 경로 조작이 필요한 경우: 예를 들어 여러 경로를 다루거나 서로 다른 OS 간 파일 작업이 필요할 때 pathlib은 매우 유용합니다. resolve()relative_to() 같은 메서드를 사용해 쉽게 절대 경로나 상대 경로를 다룰 수 있습니다.
  3. 대규모 프로젝트나 가독성이 중요한 경우: 객체 지향적 접근으로 코드 가독성이 향상됩니다. 이를 통해 대규모 프로젝트에서도 경로 조작 로직을 이해하기 쉬워집니다.

os.path와 pathlib의 비교표

특징os.pathpathlib
다루는 데이터 형식문자열Path 객체
모듈 도입 시기Python 2.x 이전부터Python 3.4 이후
작업 방식함수 기반으로 작업객체 지향으로 작업
경로 결합os.path.join()/ 연산자
절대 경로 변환os.path.abspath()Path.resolve()
추천 용도간단한 스크립트 및 레거시 코드복잡한 경로 조작 및 신규 프로젝트

구분의 결론

Python 3.4 이후 프로젝트라면 pathlib을 사용하는 것을 강력히 권장합니다. pathlib은 객체 지향 설계에 기반해 복잡한 경로 조작이 필요할 때도 직관적으로 사용할 수 있어 코드 가독성과 유지보수성이 향상됩니다. 반면 os.path는 오래된 프로젝트나 간단한 스크립트에 적합하며, 호환성이 필요한 경우 계속해서 유효합니다.

6. 자주 묻는 질문 (FAQs)

Python에서 경로 조작에 관해 자주 제기되는 질문을 모아 구체적인 답변을 제공합니다. 이를 통해 독자가 가지고 있는 일반적인 의문을 쉽게 해결할 수 있습니다.

1. Python에서 현재 작업 디렉터리(현재 디렉터리)를 가져오려면?

Python에서 현재 작업 디렉터리를 가져오는 방법은 매우 간단합니다。os 모듈을 사용하거나、pathlib 모듈을 사용하여 가져올 수 있습니다。
  • os 모듈을 사용하는 방법:
import os
current_directory = os.getcwd()
print(current_directory)
  • pathlib 모듈을 사용하는 방법:
from pathlib import Path
current_directory = Path.cwd()
print(current_directory)
두 방법 모두 현재 작업 디렉터리를 가져올 수 있으며、용도에 따라 선택해서 사용할 수 있습니다。

2. 디렉터리가 존재하지 않을 경우 디렉터리를 생성하려면?

Python에서는 디렉터리가 존재하지 않을 경우 자동으로 생성하는 방법이 있습니다。이를 위해os.makedirs() 또는pathlib.Path.mkdir()를 사용합니다。
  • os 모듈로 디렉터리 생성:
import os
dir_path = "/path/to/directory"
if not os.path.exists(dir_path):
    os.makedirs(dir_path)
  • pathlib 모듈로 디렉터리 생성:
from pathlib import Path
dir_path = Path("/path/to/directory")
if not dir_path.exists():
    dir_path.mkdir(parents=True, exist_ok=True)
특히 pathlib을 사용하면、상위 디렉터리가 존재하지 않을 경우에도parents=True 옵션으로 한 번에 생성할 수 있어 편리합니다。

3. 절대 경로와 상대 경로의 차이는 무엇인가요?

  • 절대 경로: 루트 디렉터리(Windows의 경우C:、Linux 및 macOS에서는/)에서 시작하는 완전한 경로입니다。어디서든 목적 파일이나 디렉터리에 접근할 수 있습니다。
  • 상대 경로: 현재 작업 디렉터리(현재 디렉터리)로부터의 상대적인 위치를 나타내는 경로입니다。예를 들어、현재 디렉터리가/home/user인 경우、docs/file.txt라는 상대 경로는、/home/user/docs/file.txt를 가리킵니다。
절대 경로는 항상 고유한 위치를 나타내지만、상대 경로는 현재 디렉터리가 달라지면 다른 파일이나 디렉터리를 가리킬 수 있습니다。

4. os.path와 pathlib을 동시에 사용할 수 있나요?

네、os.pathpathlib은 같은 프로젝트 내에서 함께 사용할 수 있습니다。하지만 코드의 일관성을 유지하기 위해 하나로 통일하는 것이 바람직합니다。새로운 프로젝트나 대규모 프로젝트에서는 직관적으로 사용할 수 있는pathlib 사용을 권장하지만、기존 프로젝트나 간단한 스크립트에서는os.path를 계속 사용하는 것도 유효합니다。

5. 경로 문자열을 연결할 때、왜 + 연산자가 아니라 os.path.join()이나 pathlib/ 연산자를 사용해야 하나요?

+ 연산자를 사용해 수동으로 경로를 연결하는 것도 가능하지만、OS마다 경로 구분자가 다르기 때문에(Windows에서는、Linux 및 macOS에서는/)크로스 플랫폼 대응이 어려워집니다。os.path.join()이나pathlib/ 연산자를 사용하면 이러한 차이를 자동으로 흡수하여 OS에 의존하지 않는 코드를 작성할 수 있습니다。 예를 들어、+ 연산자를 사용한 경우는 다음과 같습니다。
# 수동 결합(비추천)
path = "/user/local" + "/" + "example.txt"
한편、os.path.join()이나pathlib를 사용하면 OS에 맞는 올바른 경로를 생성할 수 있습니다。
# os.path를 사용한 결합
import os
path = os.path.join("/user/local", "example.txt")

# pathlib를 사용한 결합
from pathlib import Path
path = Path("/user/local") / "example.txt"
侍エンジニア塾