파이썬 shutil·zipfile 파일 압축과 백업 자동화 완벽 가이드
파이썬 shutil과 zipfile로 파일·폴더를 복사하고 ZIP 백업을 만드는 방법을 예제와 함께 설명합니다. 안전한 압축 해제, 무결성 검사와 자동 백업 체크리스트까지 확인하세요.

파이썬으로 폴더를 통째로 복사하고 ZIP 백업 파일까지 만들려면 shutil.copytree()와 shutil.make_archive()를 조합하는 방법이 가장 간단합니다. 특정 파일만 골라 압축하거나 압축 파일 내부의 이름을 직접 제어해야 할 때는 zipfile.ZipFile을 사용하면 됩니다. 아래 예제는 원본을 건드리지 않고 날짜별 백업 파일을 만들고, 정상 생성 여부까지 검사하는 실무형 흐름입니다.
핵심 요약
- 파일 하나는
copy2(), 폴더 전체는copytree()가 기본 선택입니다. - 폴더 전체를 간단히 ZIP으로 묶을 때는
make_archive(), 파일별 압축 경로를 정할 때는ZipFile.write()가 알맞습니다. - 백업 파일명에 실행 시각을 넣고, 임시 파일을 완성한 뒤 최종 이름으로 바꾸면 중간 실패를 구분하기 쉽습니다.
- 압축 해제 전 파일 목록과 경로를 검사하고, 신뢰할 수 없는 ZIP 파일을 바로
extractall()로 풀지 않습니다.
shutil과 zipfile, 언제 무엇을 사용할까요?
shutil은 파일과 디렉터리를 복사·이동하고, 폴더 단위 아카이브를 만들거나 푸는 고수준 모듈입니다. 반면 zipfile은 ZIP 안에 들어갈 파일을 하나씩 선택하고, 압축 방식·내부 경로·추가 모드를 세밀하게 제어할 때 적합합니다. 두 모듈 모두 파이썬 표준 라이브러리이므로 별도 설치가 필요 없습니다.
| 하려는 작업 | 권장 기능 | 선택 이유 |
|---|---|---|
| 파일 하나 복사 | shutil.copy2() |
내용과 수정 시각 등 메타데이터 보존을 시도 |
| 폴더 전체 복사 | shutil.copytree() |
하위 폴더까지 재귀적으로 처리 |
| 폴더 전체 ZIP 백업 | shutil.make_archive() |
짧은 코드로 압축 파일 생성 |
| 일부 파일만 ZIP에 추가 | zipfile.ZipFile |
파일별 내부 경로와 압축 방식 제어 |
| ZIP 내부 목록·무결성 검사 | namelist(), testzip() |
압축을 풀기 전에 내용 확인 |
운영체제에 상관없이 경로를 조합하려면 문자열을 직접 이어 붙이기보다 pathlib.Path를 함께 사용하는 편이 안전합니다. 슬래시 방향과 중복 구분자 문제를 줄이고, 파일 존재 여부도 읽기 쉽게 검사할 수 있습니다.
파일과 디렉터리 안전하게 복사하기
copy와 copy2의 차이
copy()는 파일 내용과 권한 모드를 복사하고, copy2()는 여기에 수정 시각 같은 메타데이터 보존을 추가로 시도합니다. 다만 파이썬 공식 문서가 설명하듯 소유자, ACL, 대체 데이터 스트림 등 모든 메타데이터가 운영체제 사이에서 완전히 보존되는 것은 아닙니다. 문서 백업이라면 보통 copy2()가 무난하지만, 보안 권한까지 동일해야 한다면 별도 검증이 필요합니다.
from pathlib import Path
from shutil import copy2
source = Path("reports/final.xlsx")
destination = Path("backup/final.xlsx")
destination.parent.mkdir(parents=True, exist_ok=True)
if not source.is_file():
raise FileNotFoundError(f"원본 파일 없음: {source}")
copy2(source, destination)
print(f"복사 완료: {destination}")
폴더 전체 복사
from shutil import copytree, ignore_patterns
copytree(
"project",
"backup/project",
dirs_exist_ok=True,
ignore=ignore_patterns("*.tmp", "__pycache__", ".git")
)
copytree()의 dirs_exist_ok=True는 대상 폴더가 이미 있어도 복사를 계속하고 같은 이름의 파일을 덮어쓸 수 있게 합니다. 백업본을 덮어쓰고 싶지 않다면 날짜별 새 폴더를 만들거나, 대상 경로가 존재할 때 실행을 중단하도록 조건을 두세요. 제외 패턴에는 캐시와 임시 파일만 넣고 원본 문서를 실수로 제외하지 않았는지 먼저 작은 폴더로 시험하는 것이 좋습니다.
ZIP 백업 파일 만드는 두 가지 방법
폴더 전체는 make_archive
from shutil import make_archive
archive_path = make_archive(
base_name="backup/project_20260908",
format="zip",
root_dir="project"
)
print(archive_path)
base_name에는 확장자를 제외한 출력 경로를 넣습니다. root_dir은 압축 기준 폴더입니다. 실행 결과는 실제 생성된 압축 파일 경로이며, ZIP 외에도 실행 환경에서 지원되는 tar 계열 형식을 선택할 수 있습니다. 단순한 전체 폴더 백업이라면 이 방식이 가장 읽기 쉽습니다.
일부 파일만 선택할 때는 ZipFile
from pathlib import Path
from zipfile import ZipFile, ZIP_DEFLATED
source_dir = Path("project")
targets = ["report.docx", "data/result.csv", "config.json"]
with ZipFile("backup/selected.zip", "w", compression=ZIP_DEFLATED) as zf:
for relative_name in targets:
file_path = source_dir / relative_name
if file_path.is_file():
zf.write(file_path, arcname=relative_name)
arcname은 ZIP 안에서 보일 경로입니다. 이를 생략하면 원치 않는 상위 폴더 구조가 들어갈 수 있으므로 배포용 압축 파일에서는 명시하는 편이 좋습니다. 일반 호환성이 중요하면 ZIP_DEFLATED를 우선 검토하세요. 압축 방식에 따라 필요한 선택 모듈과 다른 프로그램의 지원 범위가 달라질 수 있습니다.
압축 파일은 확인한 뒤 안전하게 풀어야 합니다
외부에서 받은 ZIP을 곧바로 풀면 파일명이 대상 폴더 밖을 가리키거나, 예상보다 지나치게 큰 파일이 생성되는 문제가 생길 수 있습니다. 파이썬의 압축 해제 기능도 위험 경로를 막기 위한 처리를 하지만, 공식 문서는 신뢰할 수 없는 아카이브를 사전 검사 없이 풀지 말라고 안내합니다. 파일 개수, 각 파일의 압축 전 크기, 절대경로와 .. 포함 여부를 확인한 뒤 전용 빈 폴더에 해제하세요.
from pathlib import Path, PurePosixPath
from zipfile import ZipFile, is_zipfile
archive = Path("incoming/data.zip")
extract_dir = Path("restored").resolve()
if not is_zipfile(archive):
raise ValueError("정상적인 ZIP 파일이 아닙니다.")
with ZipFile(archive) as zf:
for info in zf.infolist():
name = PurePosixPath(info.filename)
if name.is_absolute() or ".." in name.parts:
raise ValueError(f"위험한 경로: {info.filename}")
if info.file_size > 500 * 1024 * 1024:
raise ValueError(f"허용 크기 초과: {info.filename}")
bad_file = zf.testzip()
if bad_file:
raise ValueError(f"손상된 항목: {bad_file}")
zf.extractall(extract_dir)
예제의 500MB는 보편적인 정답이 아니라 운영 환경에 맞춰 정해야 하는 제한값입니다. 전체 압축 해제 용량과 파일 개수 제한도 함께 두면 압축 폭탄 위험을 줄이는 데 도움이 됩니다. 중요한 데이터는 압축 해제 전에 원본 ZIP의 해시값과 제공처를 별도로 확인하세요.
날짜별 자동 백업 스크립트
from datetime import datetime
from pathlib import Path
from shutil import make_archive
from zipfile import ZipFile
source = Path("work_data")
backup_dir = Path("backups")
backup_dir.mkdir(parents=True, exist_ok=True)
stamp = datetime.now().strftime("%Y%m%d_%H%M%S")
base_name = backup_dir / f"work_data_{stamp}"
if not source.is_dir():
raise FileNotFoundError(f"백업 대상 없음: {source}")
created = Path(make_archive(str(base_name), "zip", root_dir=source))
with ZipFile(created) as zf:
if zf.testzip() is not None:
created.unlink(missing_ok=True)
raise RuntimeError("ZIP 무결성 검사 실패")
print(f"백업 완료: {created}")
자동 실행에서는 성공 메시지만 남기지 말고 시작 시각, 원본 경로, 생성된 파일 크기, 검사 결과와 오류를 로그에 기록하세요. 백업 파일이 만들어졌더라도 복원 시험을 해보지 않으면 실제 장애 때 사용할 수 있는지 알 수 없습니다. 정기적으로 별도 임시 폴더에 복원하고 주요 파일의 개수나 해시를 대조하는 절차가 필요합니다.
실수 방지 체크리스트
- 원본과 백업 대상이 같은 경로가 아닌지 확인합니다.
- 백업 폴더가 원본 폴더 안에 들어가 재귀적으로 포함되지 않게 합니다.
- 덮어쓰기 전에 날짜·시각 또는 고유 번호를 파일명에 넣습니다.
copy()와copy2()의 메타데이터 차이를 확인합니다.- ZIP 내부 경로를
arcname으로 명확히 지정합니다. - 외부 ZIP은 경로·파일 개수·압축 전 크기·무결성을 검사합니다.
- 백업 직후 파일 존재 여부와 크기를 확인하고 정기적으로 복원 시험을 합니다.
- 보관 기간을 정하고 최신 파일까지 무작정 삭제하는 코드는 피합니다.
자주 묻는 질문
1. shutil과 zipfile은 설치해야 하나요?
아닙니다. 두 모듈 모두 파이썬 표준 라이브러리에 포함되어 있어 바로 불러올 수 있습니다.
2. copy와 copy2 중 무엇을 사용해야 하나요?
수정 시각 같은 메타데이터 보존이 필요하면 copy2()가 적합합니다. 다만 운영체제별 모든 속성이 완전히 복사되는 것은 아닙니다.
3. 기존 폴더에 copytree로 복사할 수 있나요?
파이썬 3.8 이상에서는 dirs_exist_ok=True를 사용할 수 있습니다. 같은 파일이 덮어써질 수 있으므로 백업 정책을 먼저 정하세요.
4. 폴더 하나를 가장 짧게 ZIP으로 만드는 방법은 무엇인가요?
shutil.make_archive("출력경로", "zip", root_dir="원본폴더")를 사용하면 됩니다.
5. ZIP 안에 일부 파일만 넣을 수 있나요?
ZipFile을 쓰기 모드로 열고 필요한 파일만 write()로 추가하면 됩니다.
6. 압축 파일에 비밀번호를 설정할 수 있나요?
표준 zipfile은 암호화된 ZIP 읽기를 일부 지원하지만 암호화 ZIP 생성 기능은 제공하지 않습니다. 보안이 필요하면 검증된 별도 도구와 키 관리 방식을 검토하세요.
7. 큰 ZIP 파일도 만들 수 있나요?
ZipFile은 기본적으로 ZIP64를 허용합니다. 다만 디스크 여유 공간과 대상 프로그램의 호환성을 함께 확인해야 합니다.
8. ZIP이 손상됐는지 어떻게 확인하나요?
testzip()은 CRC와 파일 헤더를 읽어 처음 발견한 손상 항목 이름을 반환하며, 문제가 없으면 None을 반환합니다.
9. 백업 파일을 몇 개까지 보관해야 하나요?
데이터 중요도와 저장 공간에 따라 일간·주간·월간 보존 정책을 정하세요. 최소 한 복사본은 원본 장치와 다른 위치에 두는 편이 안전합니다.
10. 스크립트를 자동 실행하면 백업이 완성되나요?
아닙니다. 실행 예약뿐 아니라 오류 알림, 무결성 검사, 보관 기간 관리와 실제 복원 시험까지 포함해야 신뢰할 수 있는 백업이 됩니다.
공식 출처
공식 문서 확인일: 2026년 9월 8일. 파이썬 버전에 따라 지원되는 압축 형식과 함수 인자가 달라질 수 있으므로 실제 실행 환경의 버전 문서를 함께 확인하세요.