엑셀 매크로(VBA) 보안 경고 끝! 파이썬으로 똑같은 작업 대체하기
"디스크 용량이 거의 다 찼는데 어떤 폴더가 그렇게 큰지 모르겠다", "다운로드 폴더가 너무 커진 것 같은데 안의 어떤 하위 폴더가 문제인지 확인하고 싶다", "여러 드라이브의 용량 현황을 정리해서 보고하고 싶다"…
윈도우 탐색기에서 폴더를 하나씩 클릭해 속성을 확인하는 방법은 폴더가 많을수록 시간이 오래 걸립니다. 파이썬을 한 번만 세팅해두면 폴더 전체를 한 번에 스캔해서 용량이 큰 순서대로 정렬하고, 차트로 시각화해서 한눈에 파악할 수 있습니다.
파이썬이 설치되어 있어야 합니다. 없다면 python.org에서 최신 버전을 받아 설치하세요. 설치 시 반드시 "Add Python to PATH"에 체크해야 합니다.
용량 분석과 시각화에 필요한 라이브러리를 설치합니다. 터미널(윈도우: CMD 또는 파워셸)을 열고 아래 명령어를 실행하세요:
pip install pandas openpyxl matplotlib
pandas는 분석 결과를 정리하고 엑셀로 저장하는 데 사용합니다. matplotlib은 용량 데이터를 막대 차트 이미지로 시각화하는 데 사용합니다. 용량 계산 자체는 파이썬 기본 내장 기능(pathlib, os)으로 처리합니다.
💡 이 코드로 할 수 있는 것: 지정한 폴더의 하위 폴더별 용량을 모두 계산해 큰 순서대로 정렬, 결과를 엑셀로 저장, 상위 10개 폴더를 막대 차트로 시각화합니다. 폴더 안에 폴더가 아무리 깊게 있어도 모두 합산해서 계산합니다.
아래 코드를 그대로 복사해서 메모장에 붙여넣고, folder_size.py로 저장하세요. 저장 시 파일 형식은 "모든 파일", 인코딩은 UTF-8로 설정합니다.
from pathlib import Path
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
# ① 설정
TARGET_FOLDER = r"C:\Users\내이름\Desktop" # ← 분석할 폴더 경로
OUTPUT_EXCEL = r"C:\Users\내이름\Desktop\용량분석_결과.xlsx"
OUTPUT_CHART = r"C:\Users\내이름\Desktop\용량분석_차트.png"
DEPTH = 1 # ← 분석할 하위 폴더 깊이 (1: 바로 아래 폴더만, 2: 그 아래까지)
TOP_N = 15 # ← 차트에 표시할 상위 폴더 개수
# ② 한글 폰트 설정 (차트용)
font_path = "C:/Windows/Fonts/malgun.ttf"
if Path(font_path).exists():
font = fm.FontProperties(fname=font_path)
plt.rcParams["font.family"] = font.get_name()
plt.rcParams["axes.unicode_minus"] = False
# ③ 폴더 용량 계산 함수 (재귀적으로 모든 하위 파일 합산)
def get_folder_size(path):
total = 0
try:
for item in path.rglob("*"):
if item.is_file():
try:
total += item.stat().st_size
except (PermissionError, OSError):
pass
except (PermissionError, OSError):
pass
return total
def format_size(bytes_size):
"""바이트를 읽기 쉬운 단위로 변환"""
for unit in ["B", "KB", "MB", "GB"]:
if bytes_size < 1024:
return f"{bytes_size:.1f}{unit}"
bytes_size /= 1024
return f"{bytes_size:.1f}TB"
# ④ 지정한 깊이까지 폴더 목록 수집
target = Path(TARGET_FOLDER)
folders_to_check = []
if DEPTH == 1:
folders_to_check = [f for f in target.iterdir() if f.is_dir()]
else:
for f in target.iterdir():
if f.is_dir():
folders_to_check.append(f)
for sub in f.iterdir():
if sub.is_dir():
folders_to_check.append(sub)
print(f" 📂 분석할 폴더: {len(folders_to_check)}개\n")
# ⑤ 각 폴더 용량 계산
results = []
for i, folder in enumerate(folders_to_check, 1):
size_bytes = get_folder_size(folder)
results.append({
"폴더경로": str(folder),
"폴더명": folder.name,
"용량(바이트)": size_bytes,
"용량(읽기쉬운형태)": format_size(size_bytes),
})
print(f" ✔ [{i}/{len(folders_to_check)}] {folder.name}: {format_size(size_bytes)}")
# ⑥ 용량 큰 순서로 정렬
df = pd.DataFrame(results).sort_values("용량(바이트)", ascending=False).reset_index(drop=True)
df["용량(MB)"] = (df["용량(바이트)"] / 1024 / 1024).round(1)
df["용량(GB)"] = (df["용량(바이트)"] / 1024 / 1024 / 1024).round(2)
# ⑦ 엑셀로 저장
df.to_excel(OUTPUT_EXCEL, index=False)
print(f"\n ✔ 엑셀 저장 완료 → {OUTPUT_EXCEL}")
# ⑧ 상위 N개 폴더 막대 차트 생성
top_df = df.head(TOP_N).sort_values("용량(MB)") # 차트는 작은 값이 위로 가도록 역순
fig, ax = plt.subplots(figsize=(10, 8))
ax.barh(top_df["폴더명"], top_df["용량(MB)"], color="#4a90d9")
ax.set_xlabel("용량 (MB)", fontsize=12)
ax.set_title(f"상위 {TOP_N}개 폴더 용량 분석", fontsize=16, pad=15)
ax.grid(axis="x", linestyle="--", alpha=0.5)
plt.tight_layout()
plt.savefig(OUTPUT_CHART, dpi=150, bbox_inches="tight")
print(f" ✔ 차트 저장 완료 → {OUTPUT_CHART}")
total_size = df["용량(바이트)"].sum()
print(f"\n✅ 완료! 전체 용량: {format_size(total_size)} / 분석 폴더: {len(df)}개")
TARGET_FOLDER에 분석할 폴더 경로를 입력합니다.DEPTH를 1로 두면 바로 아래 폴더들만, 2로 두면 그 하위 폴더까지 분석합니다.python folder_size.py
정상 실행 시 터미널에 이렇게 출력됩니다:
📂 분석할 폴더: 12개 ✔ [1/12] 다운로드: 8.4GB ✔ [2/12] 문서: 1.2GB ✔ [3/12] 사진: 24.7GB ... ✔ 엑셀 저장 완료 → C:\Users\내이름\Desktop\용량분석_결과.xlsx ✔ 차트 저장 완료 → C:\Users\내이름\Desktop\용량분석_차트.png ✅ 완료! 전체 용량: 48.3GB / 분석 폴더: 12개
엑셀 파일에는 폴더별 용량이 큰 순서로 정렬되어 저장되고, 차트 이미지에는 상위 폴더들이 막대 그래프로 시각화되어 한눈에 어떤 폴더가 용량을 많이 차지하는지 확인할 수 있습니다.
오류 1: 분석이 너무 오래 걸림
폴더 안에 파일 수가 매우 많거나(수십만 개) 네트워크 드라이브를 분석할 때 시간이 오래 걸립니다. DEPTH를 1로 줄이거나, 분석할 폴더를 더 세분화해서 나눠 실행하세요.
오류 2: PermissionError가 계속 출력됨
시스템 보호 폴더나 다른 사용자 권한의 폴더에 접근할 때 발생합니다. 코드에 이미 예외 처리가 포함되어 있어 해당 폴더는 0바이트로 건너뛰고 계속 진행됩니다. 정확한 용량이 필요하다면 관리자 권한으로 터미널을 실행하세요.
오류 3: 차트에 한글이 깨져서 네모(□)로 표시됨
한글 폰트 경로가 없을 때 발생합니다. C:\Windows\Fonts\malgun.ttf 파일이 실제로 존재하는지 확인하세요. 없다면 gulim.ttc로 경로를 바꿔서 시도해보세요.
동영상, 사진 등 특정 확장자가 차지하는 용량만 따로 분석하고 싶다면 코드 ③ 함수를 아래처럼 수정하세요.
TARGET_EXTENSIONS = {".mp4", ".mov", ".avi"} # ← 분석할 확장자만 지정
def get_folder_size_by_ext(path, extensions):
total = 0
for item in path.rglob("*"):
if item.is_file() and item.suffix.lower() in extensions:
try:
total += item.stat().st_size
except (PermissionError, OSError):
pass
return total
💡 이전 게시글과 결합하면: 용량이 큰 폴더를 찾았다면 중복 파일 자동 삭제 편으로 정리하거나, ZIP 자동 압축 편으로 압축해서 공간을 확보할 수 있습니다.
이 코드를 응용하면 여러 드라이브를 동시에 분석하거나, 일정 기간 동안 폴더 용량 변화를 추적하는 것도 가능합니다.