[파이썬 06] 다운로드 폴더 자동으로 정리하는 파이썬 스크립트


다운로드 폴더가 이미지, 문서, 압축파일로 뒤섞여 엉망이 되는 건 흔한 일이다. 이런 파일 정리 작업을 자동화할 때 쓰는 게 파이썬 표준 라이브러리에 포함된 os 모듈과 shutil 모듈이다. os는 폴더 생성이나 파일 목록 조회처럼 운영체제와 상호작용하는 기본적인 기능을 담당하고, shutil은 파일 복사·이동처럼 더 상위 수준의 파일 작업을 담당한다는 역할 구분이 있다.


1. 파일 이름 바꾸기


파일 하나의 이름을 바꾸는 가장 기본적인 방법은 os 모듈의 os.rename() 함수다. 다만 이 함수는 같은 디렉토리 안에서 이름을 바꾸는 데만 쓸 수 있고, 다른 폴더로 옮기면서 이름까지 바꾸고 싶다면 shutil 모듈의 shutil.move()를 써야 한다는 차이가 있다.


import os


os.rename("old_file.txt", "new_file.txt")


python

import shutil


shutil.move("사진/old_pic.jpg", "정리된사진/new_pic.jpg")


여러 파일을 한 번에 이름 바꾸고 싶을 땐 반복문과 조합한다. 예를 들어 폴더 안의 이미지 파일들을 순서대로 번호를 매겨 이름을 바꾸는 작업이 대표적이다.


import os


folder = "사진모음"

for i, filename in enumerate(os.listdir(folder), start=1):

old_path = os.path.join(folder, filename)

ext = os.path.splitext(filename)[1]

new_path = os.path.join(folder, f"사진_{i}{ext}")

os.rename(old_path, new_path)


os.path.splitext()는 파일명에서 확장자만 따로 분리해주는 함수라서, 새 이름을 지어줄 때 원래 확장자(.jpg, .png 등)를 그대로 유지하고 싶을 때 유용하게 쓰인다.


2. 파일 종류별로 자동 분류하기


다운로드 폴더처럼 여러 종류의 파일이 뒤섞여 있는 폴더를 확장자 기준으로 자동 분류하는 스크립트도 실무에서 자주 쓰인다. 확장자별로 이미지, 영상, 음악, 문서 카테고리를 미리 정의해두고, 폴더 안의 파일들을 순회하면서 확장자에 맞는 폴더로 옮기는 방식이다.


import os

import shutil


img_ext = (".jpg", ".jpeg", ".png", ".gif", ".webp")

doc_ext = (".pdf", ".docx", ".hwp", ".txt")

zip_ext = (".zip", ".rar", ".7z")


folder = "다운로드"

os.chdir(folder)


for file in os.listdir():

if os.path.isfile(file):

ext = os.path.splitext(file)[1].lower()

if ext in img_ext:

shutil.move(file, os.path.join("이미지", file))

elif ext in doc_ext:

shutil.move(file, os.path.join("문서", file))

elif ext in zip_ext:

shutil.move(file, os.path.join("압축파일", file))


이 코드를 돌리기 전에는 대상 폴더(이미지, 문서, 압축파일)가 미리 존재해야 하며, 존재하지 않으면 os.makedirs()로 먼저 생성해줘야 오류 없이 동작한다.


3. 폴더/파일 삭제 관련 주의사항


파일이나 폴더를 삭제하는 함수도 몇 가지로 나뉜다. os.remove()는 파일 하나를 삭제하고, os.rmdir()은 빈 폴더만 삭제 가능하며 내용물이 있으면 오류가 발생한다. 내용물이 있는 폴더까지 통째로 지우고 싶다면 shutil.rmtree()를 써야 한다.


os.remove("불필요한파일.txt") # 파일 하나 삭제

os.rmdir("빈폴더") # 빈 폴더만 삭제 가능

shutil.rmtree("폴더전체") # 내용물 있어도 통째로 삭제


이 중 shutil.rmtree()는 되돌릴 수 없는 삭제이기 때문에, 실행 전에 대상 경로가 정확한지 반드시 출력해서 확인한 뒤 실행하는 습관이 필요하다.


4. os.rename vs shutil.move, 언제 뭘 쓰나


두 함수의 차이는 사용 범위에서 갈린다. 같은 디렉토리 안에서 이름만 바꾸는 단순한 작업이거나 작업의 원자성(중간에 끊기지 않고 한 번에 완료되는 것)이 중요한 경우엔 os.rename()이 적합하고, 서로 다른 드라이브나 파일시스템 간에 파일을 옮겨야 하거나 대상 폴더가 아직 없어도 자동으로 만들어주길 원하는 경우, 혹은 이미 존재하는 파일을 덮어써야 하는 경우엔 shutil.move()가 더 적합하다.


5. 정기적으로 자동 실행하기


이렇게 만든 정리 스크립트는 한 번 실행하고 끝내기보다, 정해진 주기로 자동 실행되게 만드는 게 진짜 자동화의 완성이다. 윈도우라면 작업 스케줄러, 맥/리눅스라면 cron을 이용해 스크립트를 매일 혹은 매주 자동 실행하도록 등록해두면 사람이 신경 쓰지 않아도 다운로드 폴더가 계속 정리된 상태로 유지된다.


6. 정리


파일 이름 변경은 os.rename(), 폴더 간 이동/이름변경은 shutil.move(), 폴더째로 삭제는 shutil.rmtree()로 역할이 나뉜다. 여기에 반복문과 조건문을 조합하면 확장자별 자동 분류 스크립트까지 만들 수 있고, 이걸 스케줄러에 등록해두면 사람이 손대지 않아도 폴더가 계속 정리된 상태로 유지된다.