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

이미지
중복 파일 삭제 스크립트를 돌렸다가 식은땀 흘린 날 이 블로그의 중복 파일 자동 삭제 편 과 파일명 일괄 변경 편 을 보면 공통적으로 "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 msoffcrypto-tool openpyxl

msoffcrypto-tool은 마이크로소프트 오피스 파일의 암호화·복호화를 처리하는 라이브러리입니다. 엑셀, 워드, 파워포인트 모두 지원합니다. openpyxl은 암호가 없는 일반 엑셀 파일을 읽고 쓰는 데 사용합니다.

⚠️ 중요: msoffcrypto-tool은 암호 해제(복호화)와 파일 읽기는 지원하지만, 새 암호 설정(암호화)은 직접 지원하지 않습니다. 암호 설정은 아래에서 소개하는 win32com(엑셀이 설치된 윈도우 환경 필요) 방식을 사용합니다.

2단계: 완성 코드 — 암호 일괄 설정 (윈도우 + 엑셀 설치 환경)

엑셀이 설치되어 있는 윈도우 환경에서 사용하는 방법입니다. 먼저 추가 라이브러리를 설치합니다.

pip install pywin32

아래 코드를 set_password.py로 저장하세요.

import win32com.client as win32
from pathlib import Path

# ① 설정
FOLDER_PATH = r"C:\Users\내이름\Desktop\견적서모음"   # ← 암호 설정할 폴더
PASSWORD    = "abc1234!"                              # ← 설정할 암호 (모든 파일 동일하게 적용 시)

# 거래처별로 다른 암호를 적용하려면 아래 딕셔너리 사용 (파일명 키워드: 암호)
CUSTOM_PASSWORDS = {
    "A주식회사": "Acompany2026!",
    "B기술연구소": "Btech2026!",
}

# ② 엑셀 애플리케이션 실행 (백그라운드)
excel = win32.gencache.EnsureDispatch("Excel.Application")
excel.Visible = False
excel.DisplayAlerts = False

folder = Path(FOLDER_PATH)
xlsx_files = sorted(folder.glob("*.xlsx"))
print(f"  📂 처리할 파일: {len(xlsx_files)}개")

success = 0
failed  = 0

for file in xlsx_files:
    try:
        # 파일명에 맞는 맞춤 암호가 있으면 사용, 없으면 기본 암호 사용
        pwd = PASSWORD
        for keyword, custom_pwd in CUSTOM_PASSWORDS.items():
            if keyword in file.name:
                pwd = custom_pwd
                break

        wb = excel.Workbooks.Open(str(file))
        wb.Password = pwd          # 열기 암호 설정
        wb.Save()
        wb.Close()
        print(f"  ✔ {file.name}  →  암호 설정 완료")
        success += 1

    except Exception as e:
        print(f"  ✘ {file.name} 처리 실패: {e}")
        failed += 1

excel.Quit()
print(f"\n✅ 완료! 성공: {success}개 / 실패: {failed}개")

3단계: 완성 코드 — 암호 일괄 해제

암호가 걸린 엑셀 파일들을 한꺼번에 해제하는 코드입니다. msoffcrypto-tool을 사용하므로 엑셀 설치 없이도 동작합니다. 아래 코드를 remove_password.py로 저장하세요.

import msoffcrypto
from pathlib import Path
from io import BytesIO

# ① 설정
FOLDER_PATH = r"C:\Users\내이름\Desktop\암호걸린파일"     # ← 처리할 폴더
OUTPUT_DIR  = r"C:\Users\내이름\Desktop\암호해제결과"     # ← 결과 저장 폴더
PASSWORD    = "abc1234!"   # ← 모든 파일에 적용된 암호 (같은 암호인 경우)

output_dir = Path(OUTPUT_DIR)
output_dir.mkdir(exist_ok=True)

folder = Path(FOLDER_PATH)
xlsx_files = sorted(folder.glob("*.xlsx"))
print(f"  📂 처리할 파일: {len(xlsx_files)}개")

success = 0
failed  = 0

for file in xlsx_files:
    try:
        with open(file, "rb") as f:
            office_file = msoffcrypto.OfficeFile(f)
            office_file.load_key(password=PASSWORD)

            decrypted = BytesIO()
            office_file.decrypt(decrypted)

            out_path = output_dir / file.name
            with open(out_path, "wb") as out_f:
                out_f.write(decrypted.getvalue())

        print(f"  ✔ {file.name}  →  암호 해제 완료")
        success += 1

    except Exception as e:
        print(f"  ✘ {file.name} 해제 실패: {e}")
        failed += 1

print(f"\n✅ 완료! 성공: {success}개 / 실패: {failed}개 → {OUTPUT_DIR}")

4단계: 실행 방법

암호 설정:

  1. 코드 ① 설정의 FOLDER_PATHPASSWORD를 입력합니다. 거래처별로 다른 암호가 필요하면 CUSTOM_PASSWORDS에 추가합니다.
  2. 터미널에서 실행합니다 (반드시 PC에 엑셀이 설치되어 있어야 합니다):
python set_password.py

암호 해제:

python remove_password.py

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

  📂 처리할 파일: 3개
  ✔ 견적서_A주식회사.xlsx  →  암호 설정 완료
  ✔ 견적서_B기술연구소.xlsx  →  암호 설정 완료
  ✔ 견적서_C물산.xlsx  →  암호 설정 완료

✅ 완료! 성공: 3개 / 실패: 0개

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

오류 1: pywin32.com_error — 엑셀이 설치되지 않음

암호 설정 코드는 PC에 마이크로소프트 엑셀이 실제로 설치되어 있어야 동작합니다. 엑셀이 없는 환경(서버 등)에서는 이 방법을 사용할 수 없으며, 별도의 클라우드 API 방식이 필요합니다.

오류 2: 암호 해제 시 Invalid password 오류

PASSWORD에 입력한 암호가 실제 파일 암호와 다른 경우입니다. 대소문자, 특수문자까지 정확히 일치해야 합니다. 파일마다 암호가 다르다면 CUSTOM_PASSWORDS 방식처럼 딕셔너리로 매핑하세요.

오류 3: 처리 중 엑셀이 응답 없음 상태로 멈춤

파일이 손상되었거나 매크로 보안 경고가 떠서 자동화가 멈추는 경우입니다. 작업 관리자에서 EXCEL.EXE 프로세스를 강제 종료하고, excel.DisplayAlerts = False 설정이 코드에 포함되어 있는지 확인하세요.


응용: 엑셀 파일 목록과 암호를 엑셀로 관리하기

거래처가 많을 때는 암호를 코드에 직접 입력하는 대신 엑셀 목록에서 읽어오면 관리가 편합니다.

import pandas as pd

# 거래처명, 암호가 정리된 엑셀 파일 읽기
pwd_df = pd.read_excel(r"C:\Users\내이름\Desktop\암호목록.xlsx", engine="openpyxl")
CUSTOM_PASSWORDS = dict(zip(pwd_df["거래처명"], pwd_df["암호"]))
💡 이전 게시글과 결합하면: 엑셀 데이터 분리 저장 편으로 거래처별 파일을 만든 뒤 이 코드로 각각 암호를 설정하고, 이메일 자동 발송 편으로 암호가 걸린 파일을 안전하게 발송하는 파이프라인을 구성할 수 있습니다.

핵심 요약

  • 준비물: 암호 설정은 pywin32(엑셀 설치 필요), 암호 해제는 msoffcrypto-tool(엑셀 불필요)
  • 암호 설정: FOLDER_PATH, PASSWORD 또는 CUSTOM_PASSWORDS 수정 후 set_password.py 실행
  • 암호 해제: FOLDER_PATH, PASSWORD 수정 후 remove_password.py 실행
  • 결과: 폴더 안의 모든 엑셀 파일에 일괄 암호 설정 또는 해제, 거래처별 다른 암호 적용 가능

이 코드를 응용하면 수정 암호(쓰기 보호)만 따로 설정하거나, 특정 시트만 잠그는 부분 보호도 구현할 수 있습니다. 보안이 중요한 작업이니 암호는 안전하게 관리하시길 권장합니다.

이 블로그의 인기 게시물

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

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

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