Application/Python

[Python] 02. 파이썬으로 폴더와 파일 다루기: os, pathlib 완벽 정리

devsalix 2026. 6. 10. 10:59
728x90

파이썬으로 폴더와 파일 다루기: os, pathlib 완벽 정리

지금 잠깐, 다운로드 폴더 한 번 열어보세요.

엑셀 파일이 몇 개나 쌓여 있으세요? 저는 방금 세봤더니 47개더라고요. "정리 좀 해야지" 생각만 하고 또 새 파일을 받죠. 직장인의 다운로드 폴더는 거의 다 비슷한 상태일 거예요.

지난 글에서 한 줄짜리 파이썬 코드가 엑셀 파일 30개를 1초 만에 합치는 걸 보셨잖아요. 그런 마법이 가능하려면 먼저 한 가지를 배워야 해요. 파이썬한테 "그 파일들이 어디 있는지" 알려주는 방법이요. 그게 오늘 이야기할 파이썬 파일 경로 다루기예요.


파이썬 파일 경로, 왜 헷갈릴까

경로(path)는 그냥 파일의 우편 주소예요. 컴퓨터한테 "이 집으로 편지 보내줘"라고 알려주는 주소죠.

종류가 두 가지 있어요.

  • 절대 경로: C:\Users\Administrator\Desktop\report.xlsx 처럼 드라이브부터 끝까지 다 쓴 주소예요. "서울특별시 강남구..." 같은 느낌이고요.
  • 상대 경로: report.xlsx 처럼 "지금 있는 위치에서부터"의 주소예요. "여기서 두 블럭 직진" 같은 거죠.

자동화할 때는 절대 경로를 기준점으로 잡는 게 안전해요. 상대 경로는 "지금 어디 있냐"에 따라 결과가 달라지거든요.


파이썬 os 모듈, 꼭 알아야 할까

검색하다 보면 두 가지 도구가 나와요. os 모듈하고 pathlib 모듈이요.

os는 파이썬 초창기부터 있던 옛날 방식이고, 경로를 그냥 문자열로 다뤄요. pathlib은 Python 3.4부터 추가된 요즘 방식인데, 경로를 객체로 다뤄서 훨씬 직관적이에요.

결론부터 말씀드리면, 요즘은 pathlib만 알면 됩니다. os는 옛날 코드를 읽을 때 "아 이게 그거구나" 정도로만 알아두시면 돼요. 같은 일을 이렇게 다르게 쓰는구나, 그 정도 비교만 해볼게요.

작업 옛날 os 방식 요즘 pathlib 방식
경로 합치기 os.path.join("a", "b") Path("a") / "b"
현재 위치 os.getcwd() Path.cwd()
존재 확인 os.path.exists(p) Path(p).exists()
확장자만 추출 os.path.splitext(p)[1] Path(p).suffix

오른쪽이 훨씬 깔끔하잖아요. 그래서 이 글은 pathlib 위주로 갑니다.


python pathlib, 이거 하나면 됩니다

일단 내가 어디 있는지부터

from pathlib import Path  # pathlib에서 Path 클래스를 가져옵니다

print(Path.cwd())   # 지금 파이썬이 실행 중인 폴더
print(Path.home())  # 내 사용자 홈 폴더 (C:\Users\내이름)

 

실행하면 이런 게 나와요.

C:\Users\Administrator\Documents\python_study
C:\Users\Administrator

 

Path.home()은 정말 자주 써요. 데스크탑, 다운로드 폴더 같은 데를 가리킬 때 출발점이 되거든요.


/ 연산자로 경로 잇기 (pathlib의 매력 포인트)

여기가 진짜 매력 포인트예요.

from pathlib import Path

desktop = Path.home() / "Desktop"          # 내 데스크탑 폴더
target = desktop / "보고서" / "1월.xlsx"   # 데스크탑\보고서\1월.xlsx
print(target)

 

나누기 기호로 폴더를 이어붙여요. 처음 보면 "어 이게 되네?" 싶으실 거예요. 저도 처음엔 신기했거든요.

이게 왜 좋냐면, Windows의 그 악명 높은 백슬래시 함정을 통째로 피할 수 있어요. 한 번쯤 이런 에러 보신 적 있으실 거예요.

path = "C:\Users\Administrator\new.txt"
# SyntaxError: (unicode error) 'unicodeescape' ...

 

문자열 안의 \U를 파이썬이 유니코드 시작 신호로 해석해서 그래요. 해결 방법은 세 가지인데요.

path = r"C:\Users\Administrator\new.txt"      # 1) 앞에 r 붙이기 (raw string)
path = "C:/Users/Administrator/new.txt"        # 2) 슬래시로 쓰기 (Windows도 OK)
path = Path.home() / "new.txt"        # 3) pathlib 쓰기 (제일 깔끔)

 

3번이 답이에요. 백슬래시 신경 자체를 끌 수 있거든요.


폴더 있는지 확인하고, 없으면 만들기

folder = Path.home() / "Downloads"  # 다운로드 폴더 경로
print(folder.exists())    # True - 존재함
print(folder.is_dir())    # True - 폴더임

# 자동화 단골 패턴: 새 폴더 만들기
new_folder = Path.home() / "Desktop" / "자동분류" / "엑셀"
new_folder.mkdir(parents=True, exist_ok=True)

 

mkdir의 두 옵션은 거의 항상 같이 써요.

  • parents=True: 중간 폴더(자동분류)가 없으면 그것도 같이 만들어줘요. 안 쓰면 에러나거든요.
  • exist_ok=True: 이미 폴더가 있어도 에러 없이 그냥 넘어가요.

이 두 옵션 없이 mkdir 쓰다가 두 번째 실행에서 FileExistsError 만나서 멘붕 오는 게 입문자 단골 코스예요. 저도 그랬어요.


폴더 안의 파일 목록 보기

downloads = Path.home() / "Downloads"

# 같은 폴더 안의 xlsx 파일만 가져오기
for xlsx in downloads.glob("*.xlsx"):
    print(xlsx.name)  # 파일 이름만 출력

 

glob은 패턴 매칭이에요. *는 "아무 글자나 0개 이상"이라는 뜻이고요. "*.xlsx"는 "xlsx로 끝나는 거 다"라는 의미죠.

근데 이건 같은 폴더만 봐요. 하위 폴더까지 다 뒤지고 싶으면요.

docs = Path.home() / "Documents"

# 문서 폴더 + 모든 하위 폴더의 xlsx 다 찾기
for xlsx in docs.rglob("*.xlsx"):
    print(xlsx)

 

rglob의 r은 recursive(재귀)예요. 폴더 트리 전체를 뒤져요. 동네에 비유하자면 glob은 "이 동네에서만 찾아줘", rglob은 "이 동네랑 골목, 뒷골목까지 다 뒤져줘"인 거죠.


파일 이름 분해하기 (정말 자주 씁니다)

월간보고서_2026_06.xlsx라는 파일이 있다고 해볼게요.

p = Path.home() / "Downloads" / "월간보고서_2026_06.xlsx"

print(p.name)     # 월간보고서_2026_06.xlsx  (파일명 전체)
print(p.stem)     # 월간보고서_2026_06       (확장자 빼고)
print(p.suffix)   # .xlsx                    (확장자만)
print(p.parent)   # C:\Users\Administrator\Downloads  (속한 폴더)

 

이 네 가지(name, stem, suffix, parent)는 다음 글에서 파일 이름 일괄 변경할 때 무한 반복해서 쓸 거예요. 지금 한 번 외워두시면 두고두고 편해요.


자동화 첫 실전: 다운로드 폴더 점검

자, 이제 도입부의 약속을 지킬 시간이에요. 다운로드 폴더에 엑셀이 몇 개 있는지 세는 코드요.

from pathlib import Path

downloads = Path.home() / "Downloads"           # 내 다운로드 폴더
xlsx_list = list(downloads.glob("*.xlsx"))      # xlsx만 다 모으기

print(f"엑셀 파일이 {len(xlsx_list)}개 쌓여 있어요.")
for f in xlsx_list:
    print(" -", f.name)                         # 파일 이름 출력

 

이거 지금 복붙해서 실행해보세요. 진짜로요. 저는 47개라고 나왔어요. 여러분은요?


자주 만나는 에러와 해결법

처음에 가장 많이 만나는 세 가지만 짚을게요.

FileNotFoundError: 분명 파일이 있는데 없다고 나올 때예요. 90%는 상대 경로 썼는데 CWD(현재 작업 폴더)가 예상과 다른 경우거든요. print(Path.cwd())부터 한 번 찍어보세요.

SyntaxError: unicodeescape: 위에서 말한 백슬래시 함정이에요. 경로 문자열 앞에 r 붙이거나, 그냥 pathlib으로 갈아타시면 됩니다.

PermissionError: 엑셀에서 열린 파일을 파이썬으로 건드리려고 할 때 잘 나요. 엑셀 닫고 다시 돌리시면 풀려요.


실습 과제

  1. 다운로드 폴더에서 .pdf 파일만 골라서 이름을 출력해보세요.
  2. 데스크탑에 파이썬연습이라는 폴더를 mkdir로 만들어보세요. 두 번 실행해도 에러 안 나게요.
  3. 본인 문서 폴더 안 어딘가에 있는 .xlsx 파일을 rglob으로 다 찾아보세요. 잊고 있던 파일이 튀어나올 거예요.

여기까지 따라오셨으면 이제 파이썬한테 "그 파일들 어디 있어"를 자유롭게 알려줄 수 있게 된 거예요. 다음 글에서는 이걸 응용해서 다운로드 폴더에 흩어진 파일들 이름을 한 번에 일괄로 바꾸는 걸 해볼 거예요. 보고서.xlsx, 보고서(1).xlsx, 보고서(2).xlsx 이런 거 한 번에 2026-06-10_보고서_01.xlsx 같은 깔끔한 이름으로 바꾸는 거요. 그거 한 번 해보시면 진짜 자동화의 맛을 보실 거예요.


 


제 글이 도움이 되셨다면 댓글 & 공감 부탁드려요 😀

 

 
728x90