kgmyh Tutorial

pathlib 모듈을 이용한 경로 다루기

July 08, 2021 | 4 Minute Read

pathlib - 객체 지향 파일 시스템 경로 관리

파이썬에서 경로를 다룰때는 os 모듈을 사용했다. os 모듈에서는 다양한 경로다루는 함수들을 제공하여 함수형으로 코드를 작성했다.
pathlib는 경로를 객체지향 방식으로 다룬다.
Path 객체에 경로를 넣고 메소드를 이용해 그 경로에 대한 여러가지 작업들을 처리한다. 또 연산자가 재정의(Overloading)되어 있어 연산자를 이용해 경로를 편하게 처리할 수 있다.
다음은 경로가 있는지 여부를 확인하는 코드를 os모듈과 pathlib 모듈을 비교한 것이다.

import pathlib
import os

src_path = r"c:\src"
# os
flag = os.path.exists(src_path)
print(f'{src_path} 경로가 있는지 여부: {flag}')

# pathlib
path = pathlib.Path(src_path)
flag = p.exists()
print(f'{src_path} 경로가 있는지 여부: {flag}')
  • os 모듈은 함수들을 제공하기 때문에 원하는 기능을 제공하는 함수에 경로를 문자열로 전달해서 처리한다.
  • pathlib는 객체지향 방식이므로 Path객체에 경로를 넣고 메소드를 이용해 객체에 저장된 경로를 다룬다.

Path 클래스

  • 경로를 attribute로 가지며 경로와 관련된 다양한 기능을 제공한다.
  • 객체 생성시 경로를 넣어 준다.
    root_path = pathlib.Path(r"c:\src")
    

Path의 주요 Attribute

from pathlib import Path

file_path = Path(r"C:\src\test.py")
dir_path = Path(r"C:\src\sub_dir")

# parts 속성 - 경로 구성 요소를 튜플로 묶어서 반환
print(file_path.parts) # ('C:\\', 'src', 'test.py')
print(dir_path.parts)  # ('C:\\', 'src', 'sub_dir')

# name 속성 - 경로 구성요소의 마지막 부분을 문자열로 반환
print(file_path.name) # test.py
print(dir_path.name)  # sub_dir

# suffix 속성 - 경로가 파일일 경우 확장자를 반환
print(file_path.suffix) # .py
print(dir_path.suffix)  # None (확장자가 없으면 None반환)

# stem 속성 - 마지막 구성요소에서 확장자를 뺀 마지막 부분을 반환
print(file_path.stem)   # test (파일일 경우 확장자를 뺀 파일명을 반환)
print(dir_path.stem)    # sub_dir (디렉토리일 경우 디렉토리명을 반환)

Path의 주요 메소드

조회관련 메소드

# cwd() : class 메소드로 현재 디렉토리 조회
print(Path.cwd())

# exists(): 경로의 자원이 있는지 여부
print(Path(r'c:\src\test.py').exists()) # True: 있는 경우
print(Path(r'c:\abcdefg').exists()) # False: 없는 경우

dir_path = Path(r'c:\src')
file_path = Path(r'c:\src\test.py')

# is_dir(): 디렉토리 경로인지 여부, is_file(): 파일 경로인지 여부
print(dir_path.is_dir(), file_path.is_dir())    # True, False
print(dir_path.is_file(), file_path.is_file())  #False, True

# glob(pattern): 디렉토리 경로 안에 있는 하위 디렉토리, 파일들 중 pattern과 일치하는 것들의 경로를 제공하는 generator반환
# pattern: * - 모든 것, ** - 모든 하위디렉토리.
print(list(dir_path.glob("*"))) # 모든 하위 요소들의 경로
print(list(dir_path.glob("*.py"))) # 확장자가 .py인 모든 파일들
print(list(dir_path.glob("**/*.txt"))) # 모든 하위 경로의 파일 중 확장자가 txt인 파일들.

# samefile(other Path): 두 경로의 자원이 같은지 여부
dir_path2 = Path(r'c:\src')
print(file_path.samefile(dir_path)) #False
print(dir_path.samefile(dir_path2)) #True

os 명령어 관련 메소드

dir_path = Path(r'c:\src\my_dir')

# mkdir(parents=False, exist_ok=False): 디렉토리 생성
# parents: 부모경로가 없으면 만들지 여부. exist_ok: 있는 디렉토리 일 경우 무시할 지 여부. False 설정시 Exception 발생
dir_path.mkdir(exist_ok=True)

# rename(targetPath): 파일이나 디렉토리 이름을 target path로 변경한다. 변경된 경로를 반환한다.
# 부모디렉토리 경로를 다르게 하면 이동(move)가 된다.
new_path = dir_path.rename(r"c:\src\your_dir") #my_dir의 이름을 your_dir로 변경
new_path.rename(r'c:\temp\your_dir') #your_dir을 src 디렉토리에서 temp 디렉토리로 이동

# rmdir(): 디렉토리 삭제. 디렉토리는 비어있어야 한다.
Path(r'c:\temp\your_dir').rmdir()

# unlink(): 파일 삭제
file_path = Path(r'c:\src\test.py')
file_path.unlink()

/ 연산자 overriding - 경로 합치기

root_path = Path('root_dir')
file_path = root_path / "sub_dir1" / "sub_dir2" / "a.txt"
print(file_path)

# os 모듈에서 경로 합치기
root_path = 'root_dir'
file_path = os.path.join(root_path, 'sub_dir1', 'sub_dir2', 'a.txt')
[out]
root_dir\sub_dir1\sub_dir2\a.txt
[Back To Top] [메인 페이지]

같은 카테고리의 글들