CSV에서 열이 밀리는 이유: 쉼표·따옴표·줄바꿈 구분하기

쉼표와 줄바꿈이 들어간 가상 명단을 CSV로 저장했습니다. 정상 파일과 따옴표가 빠진 파일을 비교하고, 표가 어긋났을 때 확인할 순서를 설명합니다.

뒤로가기

한글은 멀쩡한데 표가 어긋날 수 있습니다

CSV를 열었더니 메모가 옆 열로 넘어가거나 중간에 빈 이름의 행이 생깁니다. 글자는 잘 보이는데 표의 모양만 달라졌다면 열과 행을 나누는 규칙부터 확인하세요. 문자 저장 방식 때문에 한글이 깨지는 문제와는 구분해야 합니다.

CSV는 표의 값을 글자로 저장하는 형식입니다. 흔히 쉼표로 열을 나누지만, 값 자체에 쉼표가 들어갈 수도 있습니다. 이때 쉼표가 ‘다음 열로 이동’인지 ‘메모의 일부’인지 구분하는 규칙이 필요합니다.

실제로 어떤 차이가 생기는지 보려고 가상 명단을 직접 만들어 비교했습니다. 개인정보가 아닌 실험용 이름과 문구입니다.

같은3열짜리 표를 다른 방식으로 저장했습니다

원본은 머리글1행과 데이터3행입니다. 메모마다 서로 다른 문자를 넣었습니다.

이름 수량 메모
가람 2 공책, 연필
나래 1 제목은 "준비물"
다온 3 첫째 줄 다음에 줄바꿈을 넣고 둘째 줄

첫 파일은 Python의 CSV 저장 기능으로 만들었습니다. 두 번째는 값을 쉼표로 이어 붙이기만 했습니다. 세 번째는 열을 구분하는 기호를 세미콜론(;)으로 바꿔 저장했습니다.

파일 저장 방법 읽은 행 수¹ 각 행의 열 수 원본과 일치
correct.csv 쉼표 구분, 필요한 값을 따옴표로 감쌈 4 3, 3, 3, 3 일치
unquoted.csv 따옴표 처리 없이 쉼표로 연결 5 3, 4, 3, 3, 1 불일치
semicolon.csv 세미콜론 구분, 같은 규칙으로 읽음 4 3, 3, 3, 3 일치

¹ 머리글을 포함한 수입니다. 모두 같은 UTF-8 문자 저장 방식을 썼습니다. Excel 화면을 비교한 결과가 아니라 Python의 csv.reader로 읽은 결과입니다.

쉼표와 따옴표는 이렇게 구분합니다

정상 파일의 첫 데이터 행은 다음과 같습니다.

가람,2,"공책, 연필"

큰따옴표로 감싼 공책, 연필은 한 칸의 값입니다. 따옴표가 없으면 같은 줄은4칸으로 읽힙니다.

가람,2,공책, 연필

이번 잘못된 파일에서도 이 행은 가람, 2, 공책, 연필의4칸이 됐습니다. 한 칸에 있어야 할 메모가 나뉜 것입니다.

값 안의 큰따옴표는 또 구분해야 합니다. 이번 정상 파일에서는 다음처럼 큰따옴표를 두 번 적었습니다.

나래,1,"제목은 ""준비물"""

CSV 규칙으로 읽으면 메모는 제목은 "준비물"로 돌아옵니다. 큰따옴표 두 개가 실제 메모에 그대로 추가되는 것은 아닙니다. Python의 기본 CSV 처리도 이 방식을 제공합니다. Python CSV의 따옴표 처리 설명

파일의 줄 수와 표의 행 수는 다를 수 있습니다

세 번째 메모에는 실제 줄바꿈이 들어 있습니다. 정상 파일의 끝부분은 다음처럼 텍스트 두 줄에 걸쳐 있습니다.

다온,3,"첫째 줄
둘째 줄"

따옴표 안의 줄바꿈이므로 CSV로 읽으면 메모 한 칸에 들어갑니다. 정상 파일은 텍스트로 보면5줄이지만, 표로 읽으면 머리글을 포함한4행입니다.

반면 따옴표를 처리하지 않은 파일에서는 둘째 줄이 혼자 새 행이 됐습니다. 전체 파일을 줄바꿈으로 나눈 뒤 각 줄을 쉼표로 나누는 방식도 정상 파일을 잘못 읽었습니다. CSV는 파일의 줄 수만 세어 데이터 행 수를 판단하면 안 됩니다.

Python으로 처리한다면 전용 CSV 읽기 기능을 쓰고 파일을 열 때 newline=''을 지정하세요. 공식 문서도 이 설정을 안내합니다. Python CSV 파일 읽기

구분자가 다르면 따옴표가 있어도 어긋납니다

세미콜론 파일을 세미콜론 규칙으로 읽으면 원래 표가 나왔습니다. 같은 파일을 쉼표 규칙으로 읽으면 머리글 이름;수량;메모가 한 칸에 들어갔습니다. 메모 속 쉼표는 오히려 다른 열로 나뉘었습니다.

따라서 ‘CSV니까 언제나 쉼표로 읽으면 된다’고 가정하지 마세요. 받은 파일의 내보내기 설정이나 가져오기 화면에서 구분자를 확인하세요. 자동 인식 결과가 맞는지는 미리보기의 머리글과 메모를 보고 판단하세요.

이미 잘못 나뉜 표를 다시 저장했다면 가져오기 설정만 바꿔 원래 메모를 되찾지 못할 수 있습니다. 비교할 수 있는 원본 파일을 먼저 보관하세요.

표가 밀렸을 때 확인할 순서

  1. 원본을 복사하고 복사본으로 확인하세요.
  2. 머리글이 한 칸에 몰렸다면 쉼표·세미콜론·탭 중 실제 구분자를 확인하세요.
  3. 메모가 옆 열로 넘어갔다면 값 속 쉼표와 큰따옴표 처리를 확인하세요.
  4. 이름이 비어 있는 행이나 메모만 있는 행이 생겼다면 값 속 줄바꿈을 확인하세요.
  5. 다시 읽은 표에서 머리글, 데이터 행 수, 열 수, 메모 원문을 대조하세요.

한글 자체가 깨진다면 CSV 파일의 한글이 깨질 때의 문자 저장 방식 확인부터 진행하세요. 이 글의 비교는 숫자 자동 변환이나 전화번호 앞자리0 보존까지 시험한 것은 아닙니다.

직접 확인할 파일

두 번째 파일은 표가 어긋나는 상황을 재현하기 위한 자료입니다. 제출용 명단으로 사용하지 마세요. 세 파일 모두 UTF-8이며, 파일 시작에 별도 문자 저장 방식 표시를 넣지 않았습니다. 앱의 열기 방식에 따라 문자 저장 방식을 직접 선택해야 할 수 있습니다.

2026년10월9일에 Python 3.13.1의 표준 CSV 기능으로 생성·검증했습니다. 생성 코드는 scripts/generate_blog_csv_columns.py입니다. Excel이나 Google Sheets의 메뉴와 화면을 직접 시험한 결과는 아닙니다.