inspeep

CSV 한글이 깨질 때: 인코딩·쉼표·앞자리 0을 따로 점검하는 방법

조회 수 8
추천 수 0
댓글 0

1. 한글 깨짐과 열 밀림은 다른 문제입니다

거래 내역이나 게시글 목록을 내려받았는데 한글이 이상한 문자로 보이면 파일이 손상됐다고 생각하기 쉽습니다. 그러나 파일의 바이트는 정상이고 프로그램이 다른 문자 인코딩으로 해석했을 수도 있습니다. 반대로 글자는 읽히는데 주소가 여러 열로 갈라지거나 상품 코드의 앞자리 0이 사라지는 문제는 인코딩만 바꿔서는 해결되지 않습니다.

이 글은 원본을 보존한 상태에서 세 문제를 분리해 확인하는 절차를 제안합니다. 실습 데이터는 가상의 이름과 코드를 직접 작성한 것입니다. 실제 고객 자료를 외부 변환 사이트에 올리지 않아도 같은 유형의 오류를 재현할 수 있습니다. 해결 여부는 파일이 열리는지만 보지 말고 행 수, 열 수, 중요한 값까지 비교해서 판단합니다.


2. 원본 파일과 예상 구조를 먼저 기록하세요

다운로드한 CSV를 복사하고 복사본으로 작업합니다. 첫 행이 열 이름인지, 열이 몇 개인지, 쉼표와 탭 중 어느 구분자를 쓰는지 기록하세요. 파일 확장자가 CSV라는 사실만으로 실제 구분자나 문자 인코딩까지 알 수는 없습니다. 내보내기 프로그램의 설정이 있다면 추측보다 그 값을 우선 확인합니다.

일반 텍스트 편집기로 열어 글자가 정상인지 확인하면 문제 범위를 줄일 수 있습니다. 편집기에서는 정상인데 스프레드시트에서만 깨지면 가져오기 설정을 살펴봅니다. 모두 이상하다면 원본 생성 단계 또는 인코딩 선택을 확인합니다. 이미 깨진 문자열을 다시 저장한 파일이라면 단순 재저장으로 원래 글자가 돌아온다고 기대하지 마세요.


3. UTF-8과 UTF-8 BOM을 구분하세요

UTF-8 BOM은 파일 시작의 식별 바이트입니다. 일부 도구가 UTF-8을 판단하는 데 도움이 되지만 모든 환경에서 필수인 것은 아닙니다. Python의 utf-8-sig는 쓰기에서는 BOM을 넣고 읽기에서는 있으면 제거합니다. 어느 인코딩을 사용했는지 내보내는 쪽과 받는 쪽이 합의하는 편이 가장 명확합니다.

한글 파일을 열 때마다 인코딩 후보를 바꿔 보는 방법은 임시 진단입니다. UnicodeDecodeError가 났다는 이유만으로 모든 파일을 CP949로 고정하면 다른 입력에서 같은 문제가 생깁니다. 오류를 무시하는 옵션은 문자를 잃을 수 있으므로 정답처럼 사용하지 마세요. 변환 후 이름 한 개만 확인하지 말고 특수문자와 줄바꿈이 있는 값도 비교합니다.


4. 쉼표로 직접 나누면 왜 열이 늘어날까요?

서울, 대전처럼 데이터 자체에 쉼표가 들어가면 CSV는 따옴표로 필드를 감쌉니다. 줄바꿈도 필드 안에 들어갈 수 있습니다. 따라서 split으로 줄과 쉼표를 나누는 방식은 구조를 보존하지 못합니다. Python에서는 csv 모듈의 reader와 writer로 읽고 쓰는 편이 적합합니다.

실습은 이름, 코드, 메모의 세 열을 만들고 메모에 쉼표와 줄바꿈을 넣습니다. 파일을 열 때 newline을 빈 문자열로 지정하고 csv 모듈이 줄 처리 규칙을 담당하게 합니다. 예제의 왕복 검증은 저장한 값을 다시 읽어 처음 값과 같다는 것을 확인합니다. 엑셀의 모든 가져오기 동작까지 검증하는 것은 아닙니다.


5. 숫자처럼 보여도 식별자는 문자열입니다

00123은 계산할 수량이 아니라 식별자일 수 있습니다. CSV 안에 문자열로 저장돼 있어도 스프레드시트가 숫자로 자동 변환하면 123으로 보일 수 있습니다. 이 경우 가져오기 화면에서 해당 열을 텍스트로 지정하세요. 전화번호, 우편번호, 주문 번호도 같은 판단이 필요합니다.

작업 중 이미 0이 사라졌다면 원본과 비교해야 합니다. 무조건 다섯 자리로 채우는 방식은 원래 길이를 모르는 식별자에서 틀릴 수 있습니다. 인코딩을 고쳐도 자료형 변환은 별도 문제이므로 변환 작업 기록에 두 항목을 나누어 적습니다. 정상 표시와 값 보존은 서로 다른 검사입니다.


6. 실무 적용과 실패 시 돌아갈 지점

받는 프로그램에서 파일 가져오기 기능을 선택하고 인코딩, 구분자, 텍스트 열을 명시합니다. 미리보기에서 열 이름과 첫 몇 행을 확인한 뒤 원본의 전체 행 수와 비교하세요. 제목 안의 따옴표, 메모의 줄바꿈, 빈 값이 있는 행을 표본으로 포함하면 구조 오류를 찾기 쉽습니다.

CSV는 수식, 셀 서식, 여러 시트 같은 문서 정보를 보존하는 형식이 아닙니다. 변환 후 문서 기능이 필요하다면 원본 스프레드시트를 따로 보관합니다. 외부 입력을 스프레드시트에 배포하는 경우 수식처럼 해석되는 셀도 검토해야 합니다. 아래 예제는 그런 수식 처리까지 구현한 보안 필터가 아닙니다.


7. 실습을 변형해서 검증 범위를 넓히기

첫 실습에서 값이 같다는 결과가 나오면 입력을 조금씩 바꿔 보세요. 메모에 큰따옴표를 넣거나 빈 문자열을 넣고 저장과 읽기를 다시 비교합니다. 코드 열의 값을 00001, 01000, A001처럼 다양하게 만들면 자료형을 숫자로 바꾸는 도구와의 차이를 설명하기 쉽습니다. 변형은 한 번에 하나씩 해야 실패한 조건을 알 수 있습니다.

두 번째 비교에서는 일부러 단순 split을 사용해 보고 csv reader 결과와 대조합니다. 메모에 쉼표가 없는 행에서는 둘이 같을 수 있지만 쉼표가 있는 행에서는 필드 수가 달라집니다. 일부 정상 행만 보고 전체 변환이 맞다고 결론 내리지 않는 이유입니다. 줄바꿈이 있는 필드는 화면에 여러 줄로 보여도 하나의 값일 수 있습니다.

작업 기록에는 입력 파일 이름, 인코딩, 구분자, 열 수, 데이터 행 수와 확인한 식별자 예시를 남깁니다. 파일을 다시 저장했다면 출력 이름도 적습니다. 원본과 변환본을 같은 폴더에 둘 때는 접미사로 구분하고, 검사 결과가 맞기 전에는 원본을 교체하지 않습니다. 이 순서는 데이터를 재수집할 수 없는 상황에서 특히 도움이 됩니다.

스프레드시트에서 앞자리 0 보존을 확인하려면 계산에 쓰는 수량 열과 식별자 열을 구분한 테스트 파일을 준비합니다. 수량은 합계를 계산하고 식별자는 문자 그대로 비교하세요. 모든 열을 텍스트로 만들면 일부 계산 기능이 불편해질 수 있으므로 목적별 자료형을 정하는 편이 좋습니다. 화면 서식으로 0을 표시한 결과와 원래 문자열 보존도 구분해야 합니다.

공유할 때는 개인 자료 대신 같은 구조의 가상 행을 만듭니다. 예를 들어 열 개수와 따옴표, 줄바꿈은 유지하고 실제 이름과 번호는 대체합니다. 담당자가 오류를 재현하는 데 필요한 것은 비밀 값이 아니라 형식과 처리 순서입니다. 문제가 재현되는 최소 파일을 남기면 프로그램이 바뀐 뒤에도 회귀 점검에 사용할 수 있습니다.


8. 따라 하는 예제

명령과 코드는 학습용입니다. 설명에 표시된 실행 환경을 구분하고 새 시험 폴더 또는 모의 입력으로 시작하세요.

예제 코드

import csv
from pathlib import Path
rows = [
    ['name', 'code', 'note'],
    ['홍길동', '00123', '서울, 대전'],
    ['김하나', '00456', '첫 줄\n둘째 줄'],
]
p = Path('csv_demo_utf8_bom.csv')
if p.exists():
    raise SystemExit('같은 파일이 있습니다. 새 폴더에서 실행하세요.')
with p.open('w', encoding='utf-8-sig', newline='') as f:
    csv.writer(f).writerows(rows)
with p.open(encoding='utf-8-sig', newline='') as f:
    loaded = list(csv.reader(f))
assert loaded == rows
print('행:', len(loaded), '열:', len(loaded[1]))
print('코드:', loaded[1][1])


9. 검증 결과와 해석

확인 항목결과 또는 검증 범위
BOM 바이트ef bb bf
전체 행 / 열3행 / 각 3열
식별자00123 보존
잘못된 쉼표 split메모 포함 행이 4개 필드
csv reader같은 행이 3개 필드

Python 3.12 로컬 환경에서 직접 만든 문자열의 저장·읽기를 검증했습니다. Windows Excel에서의 열 가져오기 결과는 이번 실습에서 시험하지 않았습니다.


10. 자주 묻는 질문

모든 CSV에 BOM을 넣어야 하나요?

아닙니다. 받는 프로그램의 기대 형식에 맞춰 선택합니다. 한 환경에서 잘 열린다는 사실만으로 모든 도구와 호환된다고 판단하지 마세요.

CSV를 XLSX로 바꾸면 해결되나요?

가져오기 과정에서 값이 잘못 해석되면 그 상태가 새 파일에 저장됩니다. 변환 전에 인코딩과 자료형을 확인해야 합니다.

빈 줄이 생기면 인코딩 문제인가요?

줄바꿈 처리와 필드 안 줄바꿈도 확인하세요. csv 모듈과 newline 설정을 함께 사용하고 원본 데이터와 비교합니다.

11. 공식 참고 자료

동작 정의와 옵션은 아래 제작자 문서에서 확인할 수 있습니다. 본문의 사례와 예제는 학습을 위해 독립적으로 구성했습니다.

예제 입력은 학습용 모의 자료입니다. 실제 환경에 적용할 때는 본문에 안내한 검증 범위와 조건을 확인하세요.

💬 댓글 0개

IT 게시판

공지
Notice
공지 inspeep 커뮤니티 이용 및 게시물 관리 규정 안내
👤 관리자 📅 2026.04.15 👀 조회 57 👍 추천 0
BEST
썸네일
BEST 2. 코딩 문외한의 워드프레스 정복기: VS Code와 FTP의 습격
👤 관리자 📅 2026.03.05 👀 조회 135 👍 추천 0
BEST
썸네일
Random Pick
썸네일
Random Pick 불닭 짝퉁, 스마트폰 대면 바로 들통난다
👤 루루웨도 📅 2026.10.10 👀 조회 1 👍 추천 0
개발
썸네일
AI 개발 늦추자 주장하는 아모데이 병신같은점ㅋㅋㅋ
👤 디록 📅 2026.09.14 👀 조회 13 👍 추천 0
개발
썸네일
블리자드, 스타크래프트 신작 넥슨 공동개발설 일단 부인
👤 디록 📅 2026.09.13 👀 조회 12 👍 추천 0
뉴스
썸네일
싱글벙글 아이폰듀오 팔릴때마다 함박웃음 짓는다는 기업
👤 야리타 📅 2026.09.13 👀 조회 13 👍 추천 0
개발
썸네일
AI 개발 위험성을 폭로한 제이콥 콕슨은 누구인가?
👤 K_Shit 📅 2026.09.12 👀 조회 11 👍 추천 0
뉴스
썸네일
로제 아이폰18 들자 삼성 등판 “우리한테 물어보지”..
👤 라두 📅 2026.09.12 👀 조회 10 👍 추천 0
뉴스
썸네일
삼성전자 출신이 아이폰 듀오보고 느낀점.jpg
👤 라두 📅 2026.09.11 👀 조회 10 👍 추천 0
개발
썸네일
싱글벙글 한국항공우주연구원에서 개발한 무인기
👤 야리타 📅 2026.09.11 👀 조회 12 👍 추천 0
뉴스
썸네일
아이폰 듀오 2테라가격이
👤 K_Shit 📅 2026.09.11 👀 조회 15 👍 추천 0
뉴스
썸네일
싱글벙글 폴드 8 vs 아이폰 듀오 비교
👤 라두 📅 2026.09.10 👀 조회 11 👍 추천 0
리뷰
썸네일
해외 삼엽충 리뷰어의 아이폰 듀오 평가..
👤 리토타 📅 2026.09.10 👀 조회 8 👍 추천 0
개발
썸네일
신약 개발한다던 제넨셀, 정작 임상 승인나자 실험 축소·중단
👤 리토타 📅 2026.09.10 👀 조회 7 👍 추천 0
뉴스
썸네일
충격) 불 끄고 스마트폰 봐도 시력 안 떨어져
👤 라두 📅 2026.09.09 👀 조회 12 👍 추천 0
뉴스
썸네일
아이폰 울트라, 18프로/맥스 외관 모두 공개
👤 쥬메조규 📅 2026.09.04 👀 조회 30 👍 추천 0
뉴스
썸네일
뉴스
썸네일
삼성전자, 엑시노스 AP 갤럭시 S27 울트라 탑재 예정
👤 리토타 📅 2026.09.02 👀 조회 27 👍 추천 0
뉴스
썸네일
갤럭시 S26 울트라 번인패치 사실상 실패..
👤 야리타 📅 2026.09.01 👀 조회 26 👍 추천 0
개발
썸네일
클라우드의 편리함을 버리고 온프레미스로 돌아온 이유
👤 인스피 📅 2026.09.01 👀 조회 21 👍 추천 0
뉴스
썸네일
TF 갤럭시포스 슈퍼 옵티머스 프라임 만들어옴
👤 라두 📅 2026.08.31 👀 조회 70 👍 추천 0
뉴스
썸네일
북한 스마트폰, 인터넷 없이 검열·감시까지
👤 디록 📅 2026.08.30 👀 조회 15 👍 추천 0
뉴스
썸네일
북한 스마트폰에 ‘남한’ 검색하면?
👤 K_Shit 📅 2026.08.29 👀 조회 14 👍 추천 0
개발
썸네일
"내 사이트가 왜 이렇게 느려졌지?" 데이터의 무게를 체감하다
👤 인스피 📅 2026.08.20 👀 조회 12 👍 추천 0
개발
썸네일
(앤트로픽) 클로드로 모든 약물을 end-to-end로 개발하는 계획 중
👤 야리타 📅 2026.08.19 👀 조회 11 👍 추천 0
뉴스
썸네일
kbs) "중고 아이폰 '공구' 하세요"..돈 받고 잠적
👤 리토타 📅 2026.08.15 👀 조회 16 👍 추천 0
« 처음 ‹ 이전 1 2 3 4 5 6 7 다음 › 끝 »
✏️ 글쓰기