Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python pathlib 완벽 정리: 객체 지향 파일 시스템 경로 다루기

Python의 pathlib 모듈은 파일 시스템 경로를 객체 지향적인 방식으로 처리할 수 있게 해주는 표준 라이브러리입니다. 문자열 기반의 os.path 모듈과 달리, pathlib는 경로를 하나의 '객체'로 다루기 때문에 코드가 더 직관적이고 가독성이 뛰어나며, 운영체제별 차이도 자동으로 처리해 줍니다.

pathlib 모듈이란?

pathlib 모듈은 운영체제에 적합한 경로 처리 기능을 제공하며, 이 모듈에서 정의하는 클래스는 크게 두 종류로 나뉩니다.

  • 순수 경로(Pure Path) 타입 — 순수하게 계산만 가능한 경로 객체로, 실제 파일 시스템 I/O 작업은 수행할 수 없습니다.
  • 구체 경로(Concrete Path) 타입 — 경로 계산은 물론 파일 읽기·쓰기 같은 I/O 작업까지 수행할 수 있습니다.

pathlib의 주요 클래스

번호클래스 및 설명
1PurePath
다른 모든 클래스의 기반이 되는 부모 클래스입니다.
2Path
PurePath를 상속받은 구체 클래스로, 실제 파일 시스템 경로를 나타냅니다.
3PosixPath
Windows가 아닌 OS(Linux, macOS 등)용 Path 서브클래스입니다.
4WindowsPath
Windows 시스템용 Path 서브클래스입니다.
5PurePosixPath
Windows가 아닌 시스템용 PurePath 서브클래스입니다.
6PureWindowsPath
Windows 시스템용 PurePath 서브클래스입니다.

Path 객체 생성하기

Path 클래스의 인스턴스를 생성하면 실행 중인 운영체제에 따라 자동으로 WindowsPath 또는 PosixPath 객체가 반환됩니다. 물론 WindowsPathPosixPath 객체를 직접 생성할 수도 있지만, 해당 타입과 일치하는 시스템에서만 생성이 가능합니다.

Path 객체는 다음과 같은 문법으로 생성합니다.

>>> from pathlib import *
>>> p = Path(".")
>>> type(p)
<class 'pathlib.WindowsPath'>

위 코드는 Windows 시스템에서 실행되었기 때문에 WindowsPath 객체가 생성되었습니다. 여기서 "."는 현재 디렉터리를 의미합니다.

Path 클래스의 주요 메서드

1. absolute() — 절대 경로 반환

>>> p.absolute()
WindowsPath('C:/python36')

2. exists() — 경로 존재 여부 확인

주어진 경로가 실제로 존재하면 True를 반환합니다.

>>> p = Path("mydir")
>>> p.exists()
False
>>> p = Path("etc")
>>> p.exists()
True

3. is_dir() — 디렉터리 여부 확인

>>> p = Path("etc")
>>> p.is_dir()
True
>>> p = Path("test.py")
>>> p.is_dir()
False

4. is_file() — 파일 여부 확인

>>> p = Path("tmp.py")
>>> p.is_file()
True
>>> p = Path("etc")
>>> p.is_file()
False

5. iterdir() — 디렉터리 내용 순회

경로에 해당하는 디렉터리 안의 파일명을 하나씩 생성(yield)하는 제너레이터를 반환합니다.

>>> p = Path("libs")
>>> for f in p.iterdir():
print (f)
libs\libpython36.a
libs\python3.lib
libs\python36.lib
libs\_tkinter.lib

6. mkdir() — 새 디렉터리 생성

경로에 해당하는 새 디렉터리를 생성합니다. 이미 디렉터리가 존재하면 FileExistsError가 발생하므로 주의해야 합니다.

>>> p = Path("mydir")
>>> p.mkdir()
>>> p.absolute()
WindowsPath('C:/python36/mydir')
>>> p = Path("codes")
>>> p.mkdir()
FileExistsError: [WinError 183] Cannot create a file when that file already exists: 'codes'

7. open() — 파일 열기

Path 객체가 나타내는 파일을 열어 파일 객체를 반환합니다. 내장 open() 함수와 유사하게 동작합니다.

>>> p = Path("Hello.py")
>>> f = p.open()
>>> f.readline()
'Hello Python'

8. read_bytes() — 바이너리 데이터 읽기

파일을 바이너리 모드로 열어 데이터를 읽은 후 자동으로 닫습니다.

>>> p = Path("Hello.py")
>>> p.read_bytes()
b'Hello Python'

9. read_text() — 텍스트 읽기

파일을 텍스트 모드로 열어 내용을 읽은 후 자동으로 닫습니다.

>>> p = Path("Hello.py")
>>> p.read_text()
'Hello Python'

10. write_text() — 텍스트 쓰기

파일을 열어 텍스트를 쓴 후 닫습니다. 반환값은 기록된 문자 수입니다.

>>> p = Path("Hello.py")
>>> p.write_text("Hello how are you?")
18

11. write_bytes() — 바이너리 데이터 쓰기

파일에 바이너리 데이터를 기록한 후 닫습니다.

>>> p = Path("Hello.py")
>>> p.write_bytes(b'I am fine')
9

12. stat() — 경로 정보 조회

파일 크기, 생성·수정 시간 등 해당 경로에 대한 상세 정보를 반환합니다.

>>> p.stat()
os.stat_result(st_mode=16895, st_ino=9570149208167477, st_dev=1526259762, st_nlink=1, st_uid=0, st_gid=0, st_size=0, st_atime=1543085915, st_mtime=1543085915, st_ctime=1543085915)

13. rmdir() — 디렉터리 삭제

Path 객체에 해당하는 디렉터리를 삭제합니다.

>>> p = Path("mydir")
>>> p.rmdir()

클래스 메서드: cwd()와 home()

Path.cwd() — 현재 작업 디렉터리(current working directory)의 경로를 반환하는 클래스 메서드입니다.

>>> Path.cwd()
WindowsPath('C:/python36')

Path.home() — 사용자 홈 디렉터리의 경로를 반환하는 클래스 메서드입니다.

>>> Path.home()
WindowsPath('C:/Users/acer')

'/' 연산자로 경로 조합하기

pathlib의 가장 큰 장점 중 하나는 / 연산자를 사용해 경로를 손쉽게 조합할 수 있다는 점입니다. os.path.join()보다 훨씬 직관적입니다.

>>> p = Path(".")
>>> p1 = p/'codes'
>>> p1.absolute()
WindowsPath('C:/python36/codes')

마무리

이번 글에서는 pathlib 모듈이 제공하는 객체 지향 API를 통해 파일 시스템 경로를 다루는 방법을 살펴보았습니다. 문자열 연산 대신 메서드 호출과 / 연산자로 경로를 처리하면 코드가 간결해지고 플랫폼 간 호환성도 확보됩니다. 파일 입출력 로직을 작성할 때 pathlib 사용을 적극 권장합니다.