중복 파일 삭제 스크립트를 돌렸다가 식은땀 흘린 날

이미지
중복 파일 삭제 스크립트를 돌렸다가 식은땀 흘린 날 이 블로그의 중복 파일 자동 삭제 편 과 파일명 일괄 변경 편 을 보면 공통적으로 "DRY_RUN"이라는 안전장치가 들어 있습니다. 실제 삭제나 변경 전에 미리보기부터 하도록 만든 이 습관은, 사실 처음부터 있던 게 아니라 한 번의 아찔한 경험 뒤에 생긴 것입니다. 당시 상황은 이랬습니다. 다운로드 폴더가 오래 방치되어 있어 용량을 확인해보니 중복 파일이 상당히 많았고, "파일 해시값을 비교해서 중복이면 자동으로 지우는" 스크립트를 처음 짜서 바로 실행했습니다. 사건 발생 — 실행 버튼을 누른 직후 처음 짠 코드는 대략 이런 형태였습니다. import hashlib from pathlib import Path from collections import defaultdict folder = Path(r"C:\Users\내이름\Downloads") hash_map = defaultdict(list) def get_hash(filepath): h = hashlib.md5() with open(filepath, "rb") as f: h.update(f.read()) return h.hexdigest() for file in folder.rglob("*"): if file.is_file(): hash_map[get_hash(file)].append(file) # 중복이면 첫 번째만 남기고 나머지 삭제 for files in hash_map.values(): if len(files) > 1: for f in files[1:]: f.unlink() # ← 바로 삭제 실행 print(f"삭제: {f.name}") 실행하자마자 터미널에 "삭제: ......

발표자료 슬라이드 노가다 끝! 파이썬으로 파워포인트 자동 생성하기

발표자료 슬라이드 노가다 끝! 파이썬으로 파워포인트 자동 생성하기 (완성 코드 공개)

파이썬으로 파워포인트 슬라이드를 자동으로 생성하는 모습


"매주 같은 형식의 주간 보고 슬라이드를 데이터만 바꿔서 다시 만든다", "거래처별 영업 실적 슬라이드를 30개 따로 만들어야 한다", "엑셀 데이터를 슬라이드 표로 일일이 옮겨야 한다"…

파워포인트에서 제목 텍스트박스를 클릭하고, 표를 그리고, 셀을 채우는 작업을 반복하다 보면 시간이 오래 걸립니다. 파이썬을 한 번만 세팅해두면 제목, 본문, 표, 이미지가 포함된 슬라이드를 자동으로 생성하고, 엑셀 데이터를 읽어 슬라이드 표로 그대로 변환할 수 있습니다.


1단계: 준비물 설치

파이썬이 설치되어 있어야 합니다. 없다면 python.org에서 최신 버전을 받아 설치하세요. 설치 시 반드시 "Add Python to PATH"에 체크해야 합니다.

파워포인트 생성에 필요한 라이브러리를 설치합니다. 터미널(윈도우: CMD 또는 파워셸)을 열고 아래 명령어를 실행하세요:

pip install python-pptx pandas openpyxl

python-pptx는 파워포인트(.pptx) 파일을 생성하고 편집하는 라이브러리입니다. 제목, 본문, 표, 이미지, 차트까지 모두 코드로 제어할 수 있습니다. pandasopenpyxl은 엑셀 데이터를 읽어와 슬라이드에 반영하는 데 사용합니다.

💡 이 코드로 할 수 있는 것: 표지 슬라이드, 텍스트 본문 슬라이드, 표가 포함된 데이터 슬라이드를 자동으로 생성합니다. 엑셀 파일을 읽어 거래처별로 슬라이드를 자동으로 반복 생성하는 것도 가능합니다.

2단계: 완성 코드

아래 코드를 그대로 복사해서 메모장에 붙여넣고, make_ppt.py로 저장하세요. 저장 시 파일 형식은 "모든 파일", 인코딩은 UTF-8로 설정합니다.

from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN
import pandas as pd
from datetime import datetime

# ① 설정
EXCEL_PATH  = r"C:\Users\내이름\Desktop\주간실적.xlsx"   # ← 데이터 엑셀 경로
OUTPUT_PATH = r"C:\Users\내이름\Desktop\주간보고서.pptx"  # ← 저장 경로

# ② 프레젠테이션 생성
prs = Presentation()
prs.slide_width  = Inches(13.33)   # 16:9 와이드 화면
prs.slide_height = Inches(7.5)

BLANK = prs.slide_layouts[6]   # 빈 레이아웃 사용 (자유 배치)

# ③ 표지 슬라이드
slide1 = prs.slides.add_slide(BLANK)
title_box = slide1.shapes.add_textbox(Inches(1), Inches(2.8), Inches(11), Inches(1.5))
tf = title_box.text_frame
tf.text = "주간 업무 실적 보고"
tf.paragraphs[0].font.size = Pt(44)
tf.paragraphs[0].font.bold = True
tf.paragraphs[0].font.color.rgb = RGBColor(0x2E, 0x50, 0x90)
tf.paragraphs[0].alignment = PP_ALIGN.CENTER

date_box = slide1.shapes.add_textbox(Inches(1), Inches(4.3), Inches(11), Inches(0.8))
date_box.text_frame.text = datetime.now().strftime("%Y년 %m월 %d일")
date_box.text_frame.paragraphs[0].font.size = Pt(20)
date_box.text_frame.paragraphs[0].alignment = PP_ALIGN.CENTER
print(f"  ✔ 표지 슬라이드 생성 완료")

# ④ 텍스트 본문 슬라이드 (요약)
slide2 = prs.slides.add_slide(BLANK)
header = slide2.shapes.add_textbox(Inches(0.5), Inches(0.3), Inches(12), Inches(0.8))
header.text_frame.text = "이번 주 핵심 요약"
header.text_frame.paragraphs[0].font.size = Pt(32)
header.text_frame.paragraphs[0].font.bold = True

content = slide2.shapes.add_textbox(Inches(0.8), Inches(1.5), Inches(11.5), Inches(5))
tf2 = content.text_frame
tf2.word_wrap = True

bullet_points = [
    "전체 매출 목표 105% 달성",
    "신규 거래처 3곳 계약 완료",
    "미납 거래처 2건 → 추가 관리 필요",
    "다음 주 목표: 신규 영업 5건 이상",
]
for i, point in enumerate(bullet_points):
    p = tf2.paragraphs[0] if i == 0 else tf2.add_paragraph()
    p.text = f"•  {point}"
    p.font.size = Pt(22)
    p.space_after = Pt(16)
print(f"  ✔ 요약 슬라이드 생성 완료")

# ⑤ 표 슬라이드 (엑셀 데이터를 표로 변환)
df = pd.read_excel(EXCEL_PATH, engine="openpyxl")
print(f"  ✔ 엑셀 데이터 로드: {len(df)}행")

slide3 = prs.slides.add_slide(BLANK)
header3 = slide3.shapes.add_textbox(Inches(0.5), Inches(0.3), Inches(12), Inches(0.8))
header3.text_frame.text = "거래처별 실적 현황"
header3.text_frame.paragraphs[0].font.size = Pt(32)
header3.text_frame.paragraphs[0].font.bold = True

rows, cols = len(df) + 1, len(df.columns)   # +1: 헤더 행
table_shape = slide3.shapes.add_table(
    rows, cols, Inches(0.8), Inches(1.5), Inches(11.5), Inches(0.5 * rows)
)
table = table_shape.table

# 헤더 입력
for col_idx, col_name in enumerate(df.columns):
    cell = table.cell(0, col_idx)
    cell.text = str(col_name)
    cell.text_frame.paragraphs[0].font.bold = True
    cell.text_frame.paragraphs[0].font.size = Pt(14)
    cell.fill.solid()
    cell.fill.fore_color.rgb = RGBColor(0x2E, 0x50, 0x90)
    cell.text_frame.paragraphs[0].font.color.rgb = RGBColor(0xFF, 0xFF, 0xFF)

# 데이터 입력
for row_idx, row in df.iterrows():
    for col_idx, value in enumerate(row):
        cell = table.cell(row_idx + 1, col_idx)
        cell.text = str(value)
        cell.text_frame.paragraphs[0].font.size = Pt(13)
print(f"  ✔ 표 슬라이드 생성 완료")

# ⑥ 저장
prs.save(OUTPUT_PATH)
print(f"\n✅ 완료! 슬라이드 {len(prs.slides.__iter__.__self__._sldIdLst)}장 생성 → {OUTPUT_PATH}")

3단계: 실행 방법

  1. 코드 ① 설정의 EXCEL_PATH에 표로 변환할 데이터 엑셀 경로를 입력합니다.
  2. OUTPUT_PATH에 저장할 파워포인트 경로를 입력합니다.
  3. 코드 ④의 bullet_points 목록을 원하는 요약 내용으로 수정합니다.
  4. 터미널에서 아래 명령어로 실행합니다:
python make_ppt.py

정상 실행 시 터미널에 이렇게 출력됩니다:

  ✔ 표지 슬라이드 생성 완료
  ✔ 요약 슬라이드 생성 완료
  ✔ 엑셀 데이터 로드: 8행
  ✔ 표 슬라이드 생성 완료

✅ 완료! 슬라이드 3장 생성 → C:\Users\내이름\Desktop\주간보고서.pptx

생성된 파워포인트 파일에는 표지, 요약, 데이터 표가 포함된 슬라이드 3장이 들어 있습니다. 파워포인트에서 열어 글꼴, 색상, 레이아웃을 추가로 다듬을 수 있습니다.


4단계: 자주 발생하는 오류와 해결법

오류 1: ModuleNotFoundError: No module named 'pptx'

설치 시 pptx가 아닌 반드시 python-pptx로 입력해야 합니다.

python -m pip install python-pptx

오류 2: 표 데이터가 너무 많아 슬라이드를 벗어남

엑셀 행이 많으면 표가 슬라이드 높이를 초과합니다. 행이 15개 이상이면 여러 슬라이드로 나누는 것을 권장합니다. 아래처럼 일정 개수씩 잘라서 여러 슬라이드에 분산하세요:

chunks = [df[i:i+10] for i in range(0, len(df), 10)]   # 10행씩 분할

오류 3: 마지막 줄에서 슬라이드 개수 출력 시 오류 발생

코드 ⑥의 슬라이드 개수 출력 부분이 복잡해서 오류가 날 수 있습니다. 간단하게 아래로 교체하세요:

print(f"\n✅ 완료! 슬라이드 {len(prs.slides)}장 생성 → {OUTPUT_PATH}")

응용: 거래처별로 슬라이드를 자동 반복 생성하기

엑셀에 거래처 목록이 있을 때, 거래처마다 별도의 슬라이드를 자동으로 반복 생성할 수 있습니다.

for _, row in df.iterrows():
    slide = prs.slides.add_slide(BLANK)

    title_box = slide.shapes.add_textbox(Inches(0.5), Inches(0.3), Inches(12), Inches(0.8))
    title_box.text_frame.text = f"{row['거래처명']} 실적 현황"
    title_box.text_frame.paragraphs[0].font.size = Pt(28)
    title_box.text_frame.paragraphs[0].font.bold = True

    content_box = slide.shapes.add_textbox(Inches(0.8), Inches(1.5), Inches(11), Inches(4))
    tf = content_box.text_frame
    tf.text = f"매출: {row['매출금액']:,}원\n담당자: {row['담당자']}\n상태: {row['납부상태']}"
    tf.paragraphs[0].font.size = Pt(20)
💡 이전 게시글과 결합하면: 피벗 테이블 자동 생성 편으로 데이터를 집계한 뒤 이 코드로 슬라이드 표를 만들거나, 이메일 자동 발송 편과 결합해 완성된 파워포인트를 자동으로 발송할 수 있습니다.

핵심 요약

  • 준비물: Python + python-pptx + pandas + openpyxl 설치 (pip install python-pptx pandas openpyxl)
  • 설정: EXCEL_PATH, OUTPUT_PATH, 요약 문구(bullet_points) 수정
  • 실행: 터미널에서 python make_ppt.py 입력
  • 결과: 표지·요약·표 슬라이드가 포함된 파워포인트 자동 생성, 엑셀 데이터가 표로 그대로 반영

이 코드를 응용하면 차트 이미지를 슬라이드에 자동 삽입하거나, 회사 템플릿 디자인을 그대로 활용해 내용만 채우는 것도 가능합니다.

이 블로그의 인기 게시물

느려진 구글 크롬 속도 2배 빨라지는 3가지 설정 방법 (2026년 최신 가이드)

카카오톡 용량 줄이기! 대화방 파일 삭제로 스마트폰 용량 확보법 (1분 해결)

업무 속도 3배 빨라지는 윈도우 기본 캡처 도구 단축키 및 200% 활용 꿀팁