폴더 백업·파일 전송 끝! 파이썬으로 ZIP 파일 자동 압축·해제하기
폴더 백업·파일 전송 끝! 파이썬으로 ZIP 파일 자동 압축·해제하기 (완성 코드 공개)
"이번 달 업무 파일 전부 ZIP으로 묶어서 백업해두기", "거래처에서 받은 ZIP 파일 20개를 폴더별로 풀기"…
윈도우 탐색기에서 마우스 오른쪽 클릭 → 압축 → 저장 경로 지정을 파일 수만큼 반복하는 작업은 생각보다 시간이 많이 걸립니다. 파이썬을 한 번만 세팅해두면 지정한 폴더를 자동으로 ZIP으로 압축하고, 폴더 안의 ZIP 파일을 한꺼번에 해제하는 작업을 단 한 번의 실행으로 처리할 수 있습니다. 별도 라이브러리 설치도 필요 없습니다.
1단계: 준비물 확인
파이썬이 설치되어 있어야 합니다. 없다면 python.org에서 최신 버전을 받아 설치하세요. 설치 시 반드시 "Add Python to PATH"에 체크해야 합니다.
이번 스크립트는 파이썬 기본 내장 라이브러리(zipfile, pathlib, shutil)만 사용합니다. 별도 설치가 필요 없습니다. 파이썬만 설치되어 있으면 바로 실행됩니다.
💡 이 코드로 할 수 있는 것: 폴더 전체를 ZIP 파일로 압축(날짜 자동 포함 파일명), 폴더 안의 ZIP 파일 전체 일괄 해제, 압축 시 파일 목록 출력, 해제 시 폴더별로 분리 저장까지 처리합니다.
2단계: 완성 코드 — 폴더 압축
아래 코드를 그대로 복사해서 메모장에 붙여넣고, zip_compress.py로 저장하세요. 저장 시 파일 형식은 "모든 파일", 인코딩은 UTF-8로 설정합니다.
import zipfile
from pathlib import Path
from datetime import datetime
# ① 설정
SOURCE_FOLDER = r"C:\Users\내이름\Desktop\업무파일모음" # ← 압축할 폴더 경로
OUTPUT_FOLDER = r"C:\Users\내이름\Desktop\백업" # ← ZIP 저장 폴더 경로
ADD_DATE = True # ← True: 파일명에 오늘 날짜 자동 추가
# ② 출력 폴더 생성
source = Path(SOURCE_FOLDER)
output = Path(OUTPUT_FOLDER)
output.mkdir(exist_ok=True)
# ③ ZIP 파일명 결정
date_str = f"_{datetime.now().strftime('%Y%m%d')}" if ADD_DATE else ""
zip_name = f"{source.name}{date_str}.zip"
zip_path = output / zip_name
# ④ 압축 실행
file_count = 0
with zipfile.ZipFile(zip_path, "w", zipfile.ZIP_DEFLATED) as zf:
for file in sorted(source.rglob("*")):
if file.is_file():
arcname = file.relative_to(source.parent) # 폴더 구조 유지
zf.write(file, arcname)
print(f" ✔ 추가: {arcname}")
file_count += 1
zip_size = round(zip_path.stat().st_size / 1024 / 1024, 2)
print(f"\n✅ 완료! {file_count}개 파일 압축 → {zip_path} ({zip_size}MB)")
3단계: 완성 코드 — ZIP 일괄 해제
폴더 안의 ZIP 파일을 모두 한꺼번에 해제하는 코드입니다. 아래 코드를 zip_extract.py로 저장하세요.
import zipfile
from pathlib import Path
# ① 설정
ZIP_FOLDER = r"C:\Users\내이름\Desktop\ZIP모음" # ← ZIP 파일들이 있는 폴더
OUTPUT_FOLDER = r"C:\Users\내이름\Desktop\해제결과" # ← 해제 결과 저장 폴더
EACH_SUBFOLDER = True # ← True: ZIP마다 별도 하위 폴더에 해제 / False: 한 폴더에 전부 해제
# ② 폴더 준비
zip_dir = Path(ZIP_FOLDER)
output_dir = Path(OUTPUT_FOLDER)
output_dir.mkdir(exist_ok=True)
zip_files = sorted(zip_dir.glob("*.zip"))
print(f" 📂 발견된 ZIP 파일: {len(zip_files)}개")
if not zip_files:
print("⚠ ZIP 파일을 찾을 수 없습니다. ZIP_FOLDER 경로를 확인하세요.")
else:
success = 0
failed = 0
for zip_file in zip_files:
try:
# ③ 해제 위치 결정
if EACH_SUBFOLDER:
dest = output_dir / zip_file.stem # ZIP 파일명으로 하위 폴더 생성
else:
dest = output_dir
dest.mkdir(exist_ok=True)
# ④ 해제 실행
with zipfile.ZipFile(zip_file, "r") as zf:
zf.extractall(dest)
file_count = len(zf.namelist())
print(f" ✔ {zip_file.name} → {dest.name}/ ({file_count}개 파일)")
success += 1
except zipfile.BadZipFile:
print(f" ✘ {zip_file.name}: 손상된 ZIP 파일, 건너뜀")
failed += 1
except Exception as e:
print(f" ✘ {zip_file.name}: {e}")
failed += 1
print(f"\n✅ 완료! 성공: {success}개 / 실패: {failed}개 → {OUTPUT_FOLDER}")
4단계: 실행 방법
압축할 때
- 코드 ① 설정의
SOURCE_FOLDER에 압축할 폴더 경로를 입력합니다. OUTPUT_FOLDER에 ZIP 파일을 저장할 경로를 입력합니다.- 터미널에서 실행합니다:
python zip_compress.py
해제할 때
- 코드 ① 설정의
ZIP_FOLDER에 ZIP 파일들이 있는 폴더 경로를 입력합니다. OUTPUT_FOLDER에 해제 결과를 저장할 경로를 입력합니다.- 터미널에서 실행합니다:
python zip_extract.py
압축 정상 실행 시 터미널에 이렇게 출력됩니다:
✔ 추가: 업무파일모음\1월_보고서.xlsx ✔ 추가: 업무파일모음\2월_보고서.xlsx ✔ 추가: 업무파일모음\계약서\A사_계약서.pdf ✔ 추가: 업무파일모음\계약서\B사_계약서.pdf ✅ 완료! 4개 파일 압축 → C:\Users\내이름\Desktop\백업\업무파일모음_20260529.zip (2.34MB)
5단계: 자주 발생하는 오류와 해결법
오류 1: FileNotFoundError
SOURCE_FOLDER 또는 ZIP_FOLDER에 입력한 경로가 존재하지 않는 경우입니다. 경로 앞에 r을 붙였는지 확인하고(r"C:\..." 형태), 윈도우 탐색기에서 해당 폴더가 실제로 있는지 확인하세요.
오류 2: 압축 파일을 열었을 때 한글 파일명이 깨짐
윈도우 기본 압축 해제 도구에서 한글이 깨지는 경우가 있습니다. 이 코드로 만든 ZIP은 UTF-8 인코딩을 사용하므로 반디집 또는 7-Zip으로 열면 한글 파일명이 정상적으로 표시됩니다.
오류 3: BadZipFile
ZIP 파일이 전송 중 손상되었거나, 확장자만 .zip이고 실제로는 다른 형식인 파일입니다. 해당 파일은 건너뛰고 나머지 파일은 계속 처리하도록 코드에 예외 처리가 이미 포함되어 있습니다.
응용: 매달 자동으로 백업하고 싶다면
윈도우 작업 스케줄러와 결합하면 매달 말일에 자동으로 폴더를 압축 백업할 수 있습니다. 작업 스케줄러 설정 방법은 이전 게시글 주식·환율 자동 수집 편을 참고하세요.
백업 후 오래된 ZIP 파일을 자동으로 정리하고 싶다면 압축 코드 아래에 아래 코드를 추가하세요. 30일이 지난 백업 파일을 자동으로 삭제합니다.
import time
KEEP_DAYS = 30 # ← 보관할 기간 (일 단위)
for old_zip in output.glob("*.zip"):
age_days = (time.time() - old_zip.stat().st_mtime) / 86400
if age_days > KEEP_DAYS:
old_zip.unlink()
print(f" 🗑 오래된 백업 삭제: {old_zip.name} ({int(age_days)}일 경과)")
💡 이전 게시글과 결합하면: 중복 파일 자동 삭제 편으로 먼저 중복을 제거하고, 이 스크립트로 정리된 폴더를 압축 백업하면 더욱 깔끔한 파일 관리가 됩니다.
핵심 요약
- 준비물: Python만 설치하면 됩니다. 별도 라이브러리 설치 불필요
- 압축: zip_compress.py — 폴더 구조 유지, 날짜 자동 포함 파일명으로 저장
- 해제: zip_extract.py — ZIP마다 별도 폴더에 해제, 손상 파일 자동 건너뜀
- 결과: 파일 수·크기 출력, 성공/실패 건수 확인 가능
이 코드를 응용하면 ZIP 안의 특정 확장자 파일만 골라 해제하거나, 압축 파일에 비밀번호를 설정하는 것도 가능합니다.
