엑셀 매크로(VBA) 보안 경고 끝! 파이썬으로 똑같은 작업 대체하기
"옛날 회계 시스템에서 받은 CSV 파일을 열면 한글이 ㅁㅁㅁ로 깨진다", "거래처에서 보내준 텍스트 파일이 메모장에서는 이상하게 보이는데 다른 프로그램에서는 정상이다", "수십 개의 파일을 일괄로 UTF-8로 통일해야 한다"…
한글 텍스트 파일이 깨지는 가장 흔한 원인은 인코딩 방식의 차이 때문입니다. 오래된 윈도우 프로그램은 EUC-KR(또는 CP949)을 사용하고, 최신 웹·프로그램은 UTF-8을 사용합니다. 서로 다른 인코딩으로 저장된 파일을 잘못된 방식으로 열면 한글이 깨집니다. 파이썬을 한 번만 세팅해두면 파일의 인코딩을 자동으로 감지하고 원하는 인코딩으로 일괄 변환할 수 있습니다.
파이썬이 설치되어 있어야 합니다. 없다면 python.org에서 최신 버전을 받아 설치하세요. 설치 시 반드시 "Add Python to PATH"에 체크해야 합니다.
인코딩 감지에 필요한 라이브러리를 설치합니다. 터미널(윈도우: CMD 또는 파워셸)을 열고 아래 명령어를 실행하세요:
pip install chardet
chardet은 파일의 바이트 패턴을 분석해서 어떤 인코딩으로 저장되었는지 자동으로 감지하는 라이브러리입니다. 파일을 직접 열어보지 않고도 인코딩을 알 수 있습니다.
💡 이 코드로 할 수 있는 것: 텍스트·CSV 파일의 인코딩을 자동으로 감지하고, 원하는 인코딩(UTF-8, EUC-KR, CP949 등)으로 변환해 저장합니다. 폴더 안의 여러 파일을 한꺼번에 처리할 수 있고, 변환 전후 인코딩을 로그로 기록합니다.
아래 코드를 그대로 복사해서 메모장에 붙여넣고, encoding_convert.py로 저장하세요. 저장 시 파일 형식은 "모든 파일", 인코딩은 UTF-8로 설정합니다.
import chardet
from pathlib import Path
# ① 설정
FOLDER_PATH = r"C:\Users\내이름\Desktop\텍스트모음" # ← 변환할 파일이 있는 폴더
OUTPUT_DIR = r"C:\Users\내이름\Desktop\UTF8변환결과" # ← 변환 결과 저장 폴더
TARGET_ENCODING = "utf-8" # ← 변환할 목표 인코딩 (utf-8, cp949, euc-kr 등)
SUPPORTED_EXT = {".txt", ".csv", ".log"} # ← 처리할 확장자
# ② 인코딩 자동 감지 함수
def detect_encoding(filepath):
with open(filepath, "rb") as f:
raw_data = f.read(50000) # 앞 50KB만 분석 (대용량 파일도 빠르게 처리)
result = chardet.detect(raw_data)
encoding = result.get("encoding")
confidence = result.get("confidence", 0)
# chardet이 EUC-KR을 ISO-8859-1로 잘못 인식하는 경우가 많아 보정
if encoding and encoding.lower() in ("iso-8859-1", "euc-kr"):
encoding = "cp949"
return encoding or "utf-8", confidence
# ③ 출력 폴더 생성
output_dir = Path(OUTPUT_DIR)
output_dir.mkdir(parents=True, exist_ok=True)
folder = Path(FOLDER_PATH)
files = sorted([f for f in folder.iterdir()
if f.is_file() and f.suffix.lower() in SUPPORTED_EXT])
print(f" 📂 처리할 파일: {len(files)}개\n")
success = 0
failed = 0
for file in files:
try:
# ④ 원본 인코딩 감지
detected_encoding, confidence = detect_encoding(file)
# ⑤ 감지된 인코딩으로 읽고 목표 인코딩으로 다시 저장
with open(file, "r", encoding=detected_encoding, errors="replace") as f:
content = f.read()
out_path = output_dir / file.name
with open(out_path, "w", encoding=TARGET_ENCODING) as f:
f.write(content)
print(f" ✔ {file.name} ({detected_encoding}, 신뢰도 {confidence:.0%}) → {TARGET_ENCODING}")
success += 1
except Exception as e:
print(f" ✘ {file.name} 변환 실패: {e}")
failed += 1
print(f"\n✅ 완료! 성공: {success}개 / 실패: {failed}개 → {OUTPUT_DIR}")
FOLDER_PATH에 변환할 파일이 있는 폴더 경로를 입력합니다.OUTPUT_DIR에 변환된 파일을 저장할 폴더 경로를 입력합니다.TARGET_ENCODING에 원하는 목표 인코딩을 입력합니다. 보통은 "utf-8"을 권장합니다.python encoding_convert.py
정상 실행 시 터미널에 이렇게 출력됩니다:
📂 처리할 파일: 4개 ✔ 거래내역_2025.csv (cp949, 신뢰도 99%) → utf-8 ✔ 시스템로그.txt (cp949, 신뢰도 87%) → utf-8 ✔ 회원목록.csv (utf-8, 신뢰도 100%) → utf-8 ✔ 메모.txt (cp949, 신뢰도 95%) → utf-8 ✅ 완료! 성공: 4개 / 실패: 0개 → C:\Users\내이름\Desktop\UTF8변환결과
변환된 파일들은 모두 지정한 인코딩(예: UTF-8)으로 통일되어 저장됩니다. 원본 파일은 그대로 유지됩니다.
오류 1: 변환 후에도 일부 글자가 깨짐(□ 또는 ?)
chardet의 감지 신뢰도가 낮은 경우 발생합니다. 터미널에 출력된 "신뢰도"가 70% 미만이라면 자동 감지가 부정확할 수 있습니다. 해당 파일은 detected_encoding을 "cp949" 또는 "utf-8"로 직접 지정해서 다시 시도하세요.
오류 2: UnicodeDecodeError
감지된 인코딩이 실제와 다른 경우입니다. 코드에 이미 errors="replace"가 포함되어 있어 깨지는 문자는 대체 문자로 바뀌고 멈추지 않습니다. 정확한 변환이 필요하면 해당 파일의 실제 인코딩을 다른 도구(예: 메모장++)로 직접 확인해보세요.
오류 3: ModuleNotFoundError: No module named 'chardet'
설치가 제대로 되지 않은 경우입니다. 아래 명령어로 다시 시도하세요.
python -m pip install chardet
오래된 시스템에 업로드해야 해서 EUC-KR로 변환이 필요한 경우도 있습니다. 코드 ① 설정의 TARGET_ENCODING만 바꾸면 됩니다.
TARGET_ENCODING = "cp949" # ← UTF-8 → EUC-KR(CP949)로 변환
⚠️ 주의: UTF-8에는 있지만 EUC-KR에는 없는 특수문자나 이모지가 포함된 경우, 변환 시 해당 문자가 깨질 수 있습니다. errors="replace" 설정으로 오류는 나지 않지만 일부 문자가 손실될 수 있다는 점을 참고하세요.
여러 파일을 변환한 결과를 엑셀로 정리해서 어떤 파일이 어떤 인코딩이었는지 기록할 수 있습니다.
import pandas as pd
results = [] # 반복문 안에서 각 파일의 결과를 results.append({...})로 누적
results.append({
"파일명": file.name,
"원본인코딩": detected_encoding,
"신뢰도": f"{confidence:.0%}",
"변환결과": "성공",
})
df = pd.DataFrame(results)
df.to_excel(output_dir / "변환_보고서.xlsx", index=False)
💡 이전 게시글과 결합하면: CSV 자동 병합 편의 인코딩 감지 기능과 같은 원리이며, 이 코드로 먼저 인코딩을 통일한 뒤 CSV 병합을 진행하면 더욱 안정적으로 작업할 수 있습니다.
이 코드를 응용하면 변환 전후 파일 크기를 비교하거나, 특정 인코딩의 파일만 골라서 변환하는 것도 가능합니다.