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

파일 경로 변환과 사용 방법 : 절대경로/상대경로/구분자, os/pathlib

by 브링블링 2024. 12. 16.
반응형

파일 경로 변환과 사용 방법 : 절대경로/상대경로/구분자, os/pathlib

파일 경로를 다루는 작업은 운영 체제마다 차이가 있기 때문에 플랫폼 간 호환성을 고려해야 합니다. Python은 이러한 작업을 단순화하고 플랫폼 독립성을 보장하기 위해 os 모듈과 pathlib 모듈을 제공합니다. 이 글에서는 파일 경로의 특징, 플랫폼 별 차이, 그리고 Python에서의 파일 경로 변환 및 사용 방법을 자세히 설명합니다.

 

1. 파일 경로의 기본 개념

파일 경로는 컴퓨터 파일 시스템 내에서 파일의 위치를 식별하는 문자열입니다. 경로는 다음과 같은 요소로 구성됩니다:

  1. 절대 경로 (Absolute Path): 루트 디렉토리에서 시작하는 경로입니다.
    •     Windows: C:\Users\Username\Documents\file.txt
    •     macOS/Linux: /Users/username/Documents/file.txt
  2. 상대 경로 (Relative Path): 현재 디렉토리를 기준으로 하는 경로입니다.
    •     예: ./Documents/file.txt (현재 디렉토리 기준)
  3. 경로 구분자 (Path Separator): 디렉토리 사이를 구분하는 문자입니다.
    •     Windows: 백슬래시 (\)
    •     macOS/Linux: 슬래시 (/)

2. 운영 체제별 경로 처리 방식

Windows

  •   경로 구분자: 백슬래시 (\)
  •   드라이브 문자: 경로는 드라이브 문자(예: C:)로 시작합니다.
  •   UNC 경로: 네트워크 경로는 \\ServerName\SharedFolder\File 형식을 사용합니다.
  •   대소문자 구분: 경로에서 대소문자를 구분하지 않습니다.
더보기

 

  •   백슬래시 (\) 사용:
    •   디렉터리 구분자로 백슬래시를 기본으로 사용합니다.
    •   예: C:\Users\John\Documents\file.txt
  •   드라이브 문자:
    •   경로는 특정 드라이브 문자(C:, D: 등)로 시작합니다.
    •   예: C:\Program Files
  •   UNC 경로:
    •   네트워크 경로를 표현할 때 **UNC (Universal Naming Convention)**을 사용합니다.
    •   예: \\ServerName\SharedFolder\File.txt
  •   경로 길이 제한:
    •   기본적으로 Windows는 경로의 길이를 260자로 제한합니다. (NTFS에서 이를 해제할 수 있음)
  •   대소문자 구분 없음:
    •   경로 내 대소문자를 구분하지 않습니다.
    •   예: C:\Users\John과 c:\users\john은 동일합니다.
  •   환경 변수 활용:
    •   %HOMEPATH%, %APPDATA% 같은 환경 변수를 경로 내에서 사용할 수 있습니다.
    •   예: %USERPROFILE%\Documents

 

macOS/Linux

  •   경로 구분자: 슬래시 (/)
  •   루트 디렉토리: 경로는 항상 루트 디렉토리(/)로 시작합니다.
  •   대소문자 구분: 경로에서 대소문자를 구분합니다.
  •   심볼릭 링크: 심볼릭 링크를 통해 경로를 유연하게 관리할 수 있습니다.
더보기

 

  •   슬래시 (/) 사용:
    •   디렉터리 구분자로 슬래시를 기본으로 사용합니다.
    •   예: /Users/John/Documents/file.txt
  •   루트 디렉터리 시작:
    •   경로는 항상 루트 디렉터리(/)로 시작합니다.
    •   예: /Applications, /Users
  •   대소문자 구분:
    •   파일 시스템에 따라 다릅니다.
      •   기본 파일 시스템인 APFS는 대소문자 구분을 하지 않음.
      •   옵션으로 "대소문자 구분 활성화"를 선택할 수 있음.
    •   예: /Users/John과 /users/john은 다를 수 있음.
  •   심볼릭 링크 사용:
    •   심볼릭 링크를 사용하여 특정 경로를 다른 경로로 매핑할 수 있습니다.
    •   예: /usr/local/bin이 /opt/homebrew/bin을 가리킬 수 있음.
  •   환경 변수 활용:
    •   $HOME, $PATH 같은 환경 변수를 사용할 수 있습니다.
    •   예: $HOME/Documents

 

반응형

3. Python에서 파일 경로 처리

Python은 플랫폼 간 호환성을 보장하기 위해 ospathlib 모듈을 제공합니다. 이 두 모듈은 운영 체제에 따라 경로 처리를 자동으로 조정합니다.

3.1 os 모듈

os 모듈은 파일 경로 작업을 위한 기본 기능을 제공합니다.

주요 함수

  •   os.path.join(): 경로를 결합하여 플랫폼에 맞는 경로를 생성.
  •   os.path.abspath(): 상대 경로를 절대 경로로 변환.
  •   os.path.exists(): 경로가 실제로 존재하는지 확인.

코드 예제

import os

# 경로 생성
base_dir = "folder"
sub_dir = "subfolder"
file_name = "file.txt"

# 플랫폼 독립적인 경로 생성
file_path = os.path.join(base_dir, sub_dir, file_name)
print("Generated Path:", file_path)

# 절대 경로로 변환
absolute_path = os.path.abspath(file_path)
print("Absolute Path:", absolute_path)

실행 결과 (Windows)

Generated Path: folder\subfolder\file.txt
Absolute Path: C:\Users\User\folder\subfolder\file.txt

실행 결과 (macOS/Linux)

Generated Path: folder/subfolder/file.txt
Absolute Path: /Users/user/folder/subfolder/file.txt

호출 함수 만들기

import os

def create_cross_platform_path(*paths):
    """
    OS에 맞는 파일 경로 생성
    :param paths: 경로의 각 부분
    :return: 플랫폼 독립적인 파일 경로
    """
    return os.path.join(*paths)

# 예제
base_dir = "folder"
sub_dir = "subfolder"
file_name = "file.txt"

# OS에 맞는 경로 생성
file_path = create_cross_platform_path(base_dir, sub_dir, file_name)
print("Generated Path:", file_path)

# 절대 경로로 변환
absolute_path = os.path.abspath(file_path)
print("Absolute Path:", absolute_path)

3.2 pathlib 모듈

pathlib 모듈은 객체 지향 방식으로 경로를 처리하며, Python 3.4 이상에서 사용할 수 있습니다.

주요 클래스와 메서드

  •   Path(): 경로를 나타내는 객체를 생성.
  •   Path.joinpath(): 하위 경로를 추가.
  •   Path.resolve(): 절대 경로로 변환.
  •   Path.exists(): 경로가 존재하는지 확인.

코드 예제

from pathlib import Path

# 경로 생성
base_dir = Path("folder")
sub_dir = "subfolder"
file_name = "file.txt"

# 플랫폼 독립적인 경로 생성
file_path = base_dir / sub_dir / file_name
print("Generated Path:", file_path)

# 절대 경로로 변환
absolute_path = file_path.resolve()
print("Absolute Path:", absolute_path)

# 경로를 POSIX 형식으로 변환
print("POSIX Path:", absolute_path.as_posix())

실행 결과 (Windows)

Generated Path: folder\subfolder\file.txt
Absolute Path: C:\Users\User\folder\subfolder\file.txt
POSIX Path: C:/Users/User/folder/subfolder/file.txt

실행 결과 (macOS/Linux)

Generated Path: folder/subfolder/file.txt
Absolute Path: /Users/user/folder/subfolder/file.txt
POSIX Path: /Users/user/folder/subfolder/file.txt

호출 함수 만들기

from pathlib import Path

def create_path(base_dir, sub_dir, file_name):
    """
    OS에 맞는 파일 경로 생성
    :param base_dir: 기본 디렉토리
    :param sub_dir: 하위 디렉토리
    :param file_name: 파일 이름
    :return: 플랫폼 독립적인 파일 경로
    """
    return Path(base_dir) / sub_dir / file_name

# 예제
base_dir = "folder"
sub_dir = "subfolder"
file_name = "file.txt"

# OS에 맞는 경로 생성
file_path = create_path(base_dir, sub_dir, file_name)
print("Generated Path:", file_path)

# 절대 경로로 변환
absolute_path = file_path.resolve()
print("Absolute Path:", absolute_path)

4. 두 모듈 비교

특징 os.path pathlib
코딩 스타일 절차 지향적 객체 지향적
호환성 플랫폼 독립적 플랫폼 독립적
가독성 상대적으로 낮음 상대적으로 높음
추가 기능 제한적 (단순 경로 처리) 파일/디렉토리 조작 기능 내장 (exists(), is_file() 등)
사용성 레거시 코드에 적합 최신 코드 및 Python 3.4+에 적합

5. 경로 변환의 실제 활용 사례

5.1 파일 경로를 JSON에 저장하기

POSIX 형식으로 경로를 저장하면 플랫폼 간 호환성을 유지할 수 있습니다.

import json
from pathlib import Path

# 경로 생성
path = Path("folder/subfolder/file.txt").resolve()
path_as_posix = path.as_posix()

# JSON 저장
data = {"file_path": path_as_posix}
with open("paths.json", "w") as f:
    json.dump(data, f)

5.2 파일 경로의 유효성 확인

from pathlib import Path

# 경로 확인
path = Path("folder/subfolder/file.txt")
if path.exists():
    print(f"Path exists: {path}")
else:
    print(f"Path does not exist: {path}")

5.3 정규화 함수 만들기

import os
import pathlib
import sys

def normalize_path(input_path):
    """
    전달받은 파일 경로를 윈도우와 맥에서 사용할 수 있는 경로로 변환.
    
    :param input_path: 사용자로부터 전달받은 파일 경로 (str)
    :return: OS에 적합한 정규화된 경로 (str)
    """
    # pathlib.Path를 사용하여 경로 객체 생성
    path = pathlib.Path(input_path)
    
    # 경로를 절대 경로로 변환
    absolute_path = path.resolve()
    
    # 윈도우에서의 경로 처리를 위해
    if sys.platform == "win32":
        # Windows 경로 형식으로 변환
        return absolute_path.as_posix().replace("/", "\\")
    else:
        # macOS 및 기타 UNIX 기반 OS에서는 기본 경로 반환
        return absolute_path.as_posix()

# 테스트
if __name__ == "__main__":
    # 예제 경로
    example_path = "./example/folder/file.txt"
    normalized_path = normalize_path(example_path)
    print(f"Normalized Path: {normalized_path}")
반응형