본문 바로가기
프로그래밍/Python

파이썬(Python) 폴더와 파일 다루기 (feat. os, pathlib)

by 부자 꽁냥이 2023. 4. 14.

파이썬(Python)의 내장 모듈 os와 pathlib은 폴더(디렉토리)의 생성 및 삭제 그리고 파일의 존재 유무 등을 알 수 있는 기능을 제공한다. 폴더와 파일 삭제에 대한 내용은 여기에 포스팅해두었으니 이번 포스팅에서는 os와 pathlib에서 기존에 다루지 않았지만 많이 활용되는 기능에 대해서 알아보고자 한다.


   os, pathlib 사용법

os와 pathlib은 서로 공통된 기능을 많이 제공한다. 다만 os는 문자열을 통해 폴더(또는 파일)경로를 다루지만 pathlib은 Path 객체를 통해 경로를 다루는 차이점이 있다. 여기서 다루는 내용을 요약하면 다음과 같다.

 

os, pathlib 주요 기능

 

이제 각각의 방법을 각각 알아보자.


1) 현재 폴더(디렉토리) 확인하기

현재 폴더(디렉토리)란 코드를 실행하는 파일을 포함하고 있는 폴더라고 생각하면 된다. os 모듈에서는 getcwd를 이용하면 되고 pathlib은 Path.cwd를 이용하면 된다.

 

import os
import pathlib

# 현재 디렉터리 주피터 노트북 파일 또는 파이썬 코드가 포함된 파일을 바라보는 디렉터리
print('os 모듈 =', os.getcwd())
print('pathlib 모듈 =', pathlib.Path.cwd())

 


2) 파일 또는 폴더 존재 여부

os.path.exists를 이용하면 해당 폴더 또는 파일이 주어진 경로에 존재하는지 여부를 확인할 수 있다.

 

dir_name = 'D:/myspace/blog/code'
file_name = 'D:/myspace/blog/code/Untitled.ipynb'
print(os.path.exists(dir_name)) ## 폴더가 존재하는가?
print(os.path.exists(file_name)) ## Untitled.ipynb 파일이 존재하는가?

 

 

pathlib.Path.exists 함수를 이용해도 된다. 다만 함수 인자에 경로를 문자열이 아닌 Path 객체를 넣어줘야한다.

 

path1 = pathlib.Path(dir_name) ## Path 객체로 변환해야한다.
path2 = pathlib.Path(file_name) 
print(pathlib.Path.exists(path1)) ## 폴더가 존재하는가?
print(pathlib.Path.exists(path2)) ## 파일이 존재하는가?

 


3) 폴더 만들기

os.makedirs를 이용하면 폴더를 생성할 수 있다. os.makedirs는 경로 중간의 폴더가 없는 경우에도 중간 폴더까지 다 생성해 준다. 이때 exist_ok=True로 설정하면 폴더가 존재하는 경우에는 별도의 에러를 발생시키지 않고 넘어가고 (물론 폴더를 새로 만들지도 않는다) exist_ok=False로 지정한 경우 기존의 폴더가 이미 있다면 에러(FileExistsError)를 발생시킨다.

 

dir_name = './parent_folder/child_folder'

os.makedirs(dir_name, exist_ok=True)

 

pathlib을 이용해서도 폴더를 만들 수 있다. 먼저 Path 객체를 생성한 다음 mkdir 메서드(함수)를 사용하면 폴더를 생성할 수 있다. 다만 parents=True로 설정해야 중간에 있는 폴더까지 생성해 줄 수 있다.

 

dir_name = './parent_folder/child_folder'
wp_dir_name = pathlib.Path(dir_name)
wp_dir_name.mkdir(parents=True, exist_ok=True) ## parents를 True 해야 리커시브하게 폴더 생성할 수 있다.

4) 파일과 폴더 확인

os.listdir을 이용하면 주어진 경로 안에 파일과 폴더가 무엇이 있는지 확인할 수 있다.

 

os.listdir('./parent_folder')

 

pathlib에서는 Path 객체를 먼저 만들어준 뒤 glob 메서드를 이용하면 된다. 이때 모든 파일과 폴더를 뜻하는 기호 '*'를 넣어준다. glob이 반환하는 것은 generator이므로 그 결과를 확인하려면 list로 감싸준다. os.listdir과는 다르게 문자열이 아닌 Path 객체의 리스트가 반환된다.

 

p = pathlib.Path('./parent_folder').glob('*')
list(p)

 


5) 상위 폴더 확인

os.path.dirname을 이용하면 현재 폴더의 상위 폴더(또는 부모 폴더)를 알 수 있다.

 

cur_dir = os.getcwd() ## 현재 디렉토리
os.path.dirname(cur_dir)

 

 

pathlib에서는 Path 객체를 만들어주고 parent 속성을 통해 상위 폴더를 알 수 있다.

 

wp_cur_dir = pathlib.Path(cur_dir)
wp_cur_dir.parent

 

 

참고로 Path 객체가 갖고 있는 경로를 문자열로 바꾸고 싶다면 str으로 감싸면 된다.

 

str(wp_cur_dir.parent)

 


6) 경로 연결

경로 연결이란 한 폴더와 그 내부에 있는 폴더 또는 파일 경로를 연결하는 것을 말한다. os.path.join을 이용하면 경로를 연결할 수 있다. 이때 첫 번째 인자는 부모 폴더, 두 번째 인자는 자식 폴더 또는 파일이어야 한다. pathlib은 Path 객체를 만들어주고 joinpath에 연결한 자식 폴더 또는 파일을 입력하면 된다.

 

# 디렉토리 + 디렉토리 또는 디렉토리 + 파일 연결
parent_dir_name = './parent_folder'
child_dir_name = 'child_folder'
print('os :' ,os.path.join(parent_dir_name, child_dir_name))
print('pathlib :', pathlib.Path(parent_dir_name).joinpath(child_dir_name))

 


7) 파일명과 확장자 분리

os.path.splitext를 이용하면 파일명과 확장자를 분리할 수 있다.

 

file_path = 'empty2.v.1.txt'
os.path.splitext(file_path)

 

 

pathlib에서는 파일명과 확장자를 분리하는 함수는 없지만 stem과 suffix를 통해 각각 파일명과 확장자를 얻을 수 있다. 아래 코드는 os.path.splitext와 동일한 결과를 출력한다.

 

path = pathlib.Path(file_path)
(path.stem, path.suffix)

 


댓글


맨 위로