파이썬 CSV 한글 깨짐 해결: Excel용 인코딩과 입력 파일 판별 순서

먼저 원본 CSV를 만든 프로그램과 오류 위치를 확인한 뒤 입력 인코딩을 맞추고, 일반 교환에는 utf-8을 사용하며 Excel 전달에서 BOM이 필요한 경우에만 utf-8-sig로 저장합니다.

입력 문제와 출력 문제 나누기

Python에서 CSV를 읽는 순간 UnicodeDecodeError가 나면 입력 파일을 연 인코딩이 실제 바이트와 맞지 않을 가능성이 큽니다. Python에서 읽은 값은 정상인데 Excel에서만 깨지면 출력 파일의 인코딩을 확인합니다. 파일을 만든 프로그램, 오류가 난 단계, 실제 저장 방식을 기록하면 인코딩을 무작정 추정하지 않아도 됩니다.

CP949로 만들어진 입력을 UTF-8이라고 단정하거나, 모든 출력에 BOM을 붙이는 방식은 문제를 숨길 수 있습니다. 원본을 만든 쪽의 내보내기 설정을 먼저 확인합니다.

csv를 열 때 encoding과 newline 지정하기

Python csv 파일은 open()에서 newline=””을 지정해 열고, 읽기·쓰기에 사용할 인코딩은 encoding으로 명시해야 합니다.

입력 파일이 UTF-8이라는 근거가 있으면 csv.reader에 넘길 파일을 encoding=”utf-8″, newline=””으로 엽니다. newline=””은 csv 모듈이 줄바꿈을 직접 처리하도록 하는 설정이며 인코딩 문제를 해결하는 설정은 아닙니다.

utf-8과 utf-8-sig 구분하기

utf-8은 BOM 없이 문자를 저장하는 일반적인 선택입니다. 여러 시스템 사이에서 파일을 주고받는다면 먼저 utf-8을 고려합니다.

utf-8-sig는 저장할 때 UTF-8 BOM을 앞에 붙이고, 읽을 때 파일 시작의 BOM을 건너뛰는 변형이므로 Excel 전달처럼 BOM 호환성이 필요한 경우에만 선택합니다.

이 설정은 CP949 입력을 읽는 만능 해법이 아닙니다. 이미 CP949로 저장된 입력과 새 파일을 Excel에 전달하는 문제를 구분해야 합니다.

CP949 입력은 근거로 확인하기

CP949 입력으로 의심되는 파일을 UTF-8로 열었을 때 오류가 난다면 파일 생성 프로그램의 내보내기 설정부터 확인합니다. 확인 결과가 CP949라면 읽기에만 해당 인코딩을 지정하고, 처리한 결과는 목표 시스템이 요구하는 출력 인코딩으로 다시 저장합니다.

글자가 정상인데 열이 한 칸으로 합쳐지면 delimiter, 줄이 비정상적으로 나뉘면 줄바꿈과 인용부호를 별도로 확인합니다.

저장 설정을 결정하는 기준

이 글의 목적은 인코딩 이름을 외우는 것이 아니라, 깨짐이 입력 문제인지 Excel 전달 문제인지 나눠 다음 파일 처리 설정을 결정하는 것입니다.

  • 입력에서 UnicodeDecodeError: 원본 생성 경로를 확인하고 실제 인코딩으로 읽습니다.
  • Python에서는 정상, Excel에서만 깨짐: Excel 전달용 출력에 utf-8-sig가 필요한지 확인합니다.
  • 시스템 간 일반 교환: 상대 시스템의 요구가 없다면 utf-8을 우선 검토합니다.
  • 글자는 정상인데 열 구성이 이상함: 인코딩이 아니라 delimiter, newline, quote 설정을 점검합니다.

입력 파일의 인코딩을 추정하지 않고 생성 프로그램과 오류 위치를 함께 기록하면 같은 파일을 반복해서 잘못 읽는 일을 줄일 수 있습니다. 출력 대상이 일반 시스템인지 Excel 사용자인지 먼저 정하면 utf-8과 utf-8-sig를 필요한 곳에만 적용할 수 있습니다.

이 기준을 적용한 다음에는 Excel에서 앞자리 영이나 날짜가 자동 변환되는 문제를 별도의 데이터 형식 문제로 확인하면 됩니다.

Leave a Comment