IT Best Practise/Python

Python의 pathlib 모듈: 파일 시스템 경로 작업의 혁신

GilliLab IT 2024. 12. 2. 11:42
728x90
반응형

Python의 pathlib 모듈: 파일 시스템 경로 작업의 혁신

Python에서 파일 및 디렉터리 작업은 매우 흔하게 이루어집니다.
과거에는 os와 os.path 모듈을 사용했지만, Python 3.4부터 도입된 pathlib 모듈은 객체 지향적이고 직관적인 인터페이스를 제공합니다.
pathlib의 주요 기능과 사용법에 대해 자세히 알아보겠습니다.

pathlib 소개

pathlib 모듈은 파일 시스템 경로를 객체로 다루는 Python의 표준 라이브러리. 기존의 문자열 기반 파일 경로 처리보다 더 직관적이고 효율적인 방법을 제공. 이 모듈의 핵심은 Path 클래스이며, 이를 통해 파일 및 디렉터리 작업을 쉽게 수행 가능.

Path 객체 생성

pathlib의 핵심은 Path 클래스. 이를 사용하여 파일 경로나 디렉터리를 객체로 표현.

# 현재 디렉터리
current_dir = Path('.')

# 홈 디렉터리
home_dir = Path.home()

# 특정 경로
specific_path = Path('/usr/local/bin')

Path 객체는 문자열로 파일 경로를 다루는 것보다 훨씬 직관적이며, 다양한 메서드를 통해 경로 조작을 간편 사용.

파일 및 디렉터리 작업

pathlib은 파일과 디렉터리를 다루기 위한 여러 기능을 제공. 디렉터리 생성, 파일 존재 여부 확인, 파일 읽기 및 쓰기 등을 쉽게 수행.

파일 존재 여부 확인

file_path = Path('example.txt')
if file_path.exists():
    print("파일이 존재합니다.")
else:
    print("파일이 존재하지 않습니다.")
  • exists(): 파일 또는 디렉터리가 존재하는지 확인.
  • is_file(), is_dir(): 경로가 파일인지, 디렉터리인지를 각각 확인.
if file_path.is_file():
    print("파일입니다.")
elif file_path.is_dir():
    print("디렉터리입니다.")

디렉터리 생성

dir_path = Path('new_directory')
dir_path.mkdir(exist_ok=True)  # 디렉터리가 이미 존재해도 오류 발생 안 함
  • mkdir() 메서드는 디렉터리를 생성.
  • exist_ok=True 옵션을 사용하면 디렉터리가 이미 존재할 때 오류가 발생하지 않음.
  • 여러 중첩된 디렉터리를 한 번에 생성하고 싶을 때는 parents=True 옵션 사용.
nested_dir_path = Path('parent/child/grandchild')
nested_dir_path.mkdir(parents=True, exist_ok=True)

파일 읽기 및 쓰기

파일 읽기와 쓰기도 간단.

# 파일 쓰기
file_path = Path('example.txt')
file_path.write_text('Hello, pathlib!')

# 파일 읽기
content = file_path.read_text()
print(content)
  • write_text()read_text() 메서드를 사용해 파일의 내용을 간편하게 쓸 수 있고 읽기 가능.
  • 바이너리 파일 작업을 위해 write_bytes()read_bytes() 메서드를 사용.
# 바이너리 파일 쓰기
binary_path = Path('example.bin')
binary_path.write_bytes(b'Hello, binary pathlib!')

# 바이너리 파일 읽기
binary_content = binary_path.read_bytes()
print(binary_content)

파일 삭제

파일이나 디렉터리를 삭제.

file_to_delete = Path('example.txt')
if file_to_delete.exists():
    file_to_delete.unlink()
    print("파일이 삭제되었습니다.")
  • unlink(): 파일을 삭제.
  • 디렉터리를 삭제하려면 rmdir() 메서드 사용.
dir_to_delete = Path('new_directory')
if dir_to_delete.exists():
    dir_to_delete.rmdir()
    print("디렉터리가 삭제되었습니다.")
  • 주의: rmdir()은 비어 있는 디렉터리만 삭제 가능.

경로 조작

pathlib은 경로를 조작하는 데 유용한 여러 메서드를 제공. 경로 합치기, 부모 디렉터리 참조, 파일 이름 추출 등을 쉽게 수행.

경로 합치기

base_dir = Path('/usr/local')
new_path = base_dir / 'bin' / 'python'
print(new_path)  # /usr/local/bin/python
  • 슬래시(/) 연산자를 사용하여 경로를 합칠 수 있음.
  • 문자열을 직접 이어붙이는 것보다 훨씬 간결하고 가독성이 좋음.

부모 디렉터리 참조 및 파일 이름 추출

file_path = Path('/usr/local/bin/python')

# 부모 디렉터리 참조
parent_dir = file_path.parent
print(parent_dir)  # /usr/local/bin

# 파일 이름 추출
file_name = file_path.name
print(file_name)  # python

# 확장자 추출
file_suffix = file_path.suffix
print(file_suffix)  # .py

# 확장자 없이 파일 이름 추출
file_stem = file_path.stem
print(file_stem)  # python
  • parent 속성을 사용해 부모 디렉터리를 참조.
  • name, suffix, stem 속성을 통해 파일 이름과 확장자를 추출.
  • with_suffix() 메서드를 사용해 파일의 확장자를 변경.
new_file_path = file_path.with_suffix('.txt')
print(new_file_path)  # /usr/local/bin/python.txt

경로 절대화

resolve() 메서드를 사용해 경로를 절대 경로로 변환. 경로에 심볼릭 링크가 포함되어 있으면 이를 실제 경로로 해석.

relative_path = Path('some/relative/path')
absolute_path = relative_path.resolve()
print(absolute_path)  # /home/user/some/relative/path (절대 경로로 변환된 결과)
  • resolve(): 상대 경로를 절대 경로로 변환하고, 심볼릭 링크를 실제 경로로 해석.
  • 경로가 존재하지 않는 경우 strict=False 옵션을 사용하여 에러 없이 절대 경로를 반환.
non_existent_path = Path('non_existent/path')
resolved_path = non_existent_path.resolve(strict=False)
print(resolved_path)  # 절대 경로 반환, 존재하지 않는 경우에도 오류 발생 안 함

glob 기반 파일 검색

pathlibglob() 메서드를 사용해 특정 패턴에 맞는 파일 검색. ex) 현재 디렉터리에서 모든 .txt 파일을 찾는 방법:

for txt_file in Path('.').glob('*.txt'):
    print(txt_file)
  • glob() 메서드는 제너레이터를 반환하므로, 매우 큰 디렉터리에서도 효율적으로 파일을 검색할 수 있음.
  • rglob() 메서드를 사용하면 하위 디렉터리까지 포함하여 재귀적으로 파일을 검색할 수 있음.
for txt_file in Path('.').rglob('*.txt'):
    print(txt_file)

파일 속성 확인

pathlib을 사용하여 파일의 다양한 속성을 확인.

file_path = Path('example.txt')

# 파일 크기 확인
if file_path.exists():
    print(f"파일 크기: {file_path.stat().st_size} bytes")

# 마지막 수정 시간 확인
import datetime
mod_time = datetime.datetime.fromtimestamp(file_path.stat().st_mtime)
print(f"마지막 수정 시간: {mod_time}")
  • stat() 메서드를 사용하여 파일의 메타데이터(크기, 생성 시간 등)를 확인.

pathlib 장점

pathlib은 기존의 os.path 모듈에 비해 다음과 같은 장점:

  1. 객체 지향 인터페이스: 파일 경로를 문자열로 다루는 대신 객체로 다룸으로써 더 직관적이고 안전한 코드를 작성.
  2. 일관된 경로 조작: / 연산자를 사용해 경로를 쉽게 합칠 수 있어 코드의 가독성 향상.
  3. 다양한 파일 시스템 지원: pathlib은 로컬 파일 시스템뿐만 아니라 ZIP 파일과 같은 다양한 파일 시스템도 지원.

Keywords

python, pathlib, file handling, path manipulation, file system, 파이썬, pathlib 모듈, 파일 처리, 경로 조작, 파일 시스템

728x90
반응형