본문 바로가기
C.W.K.
Stream
Lesson 01 of 06 · published

CSV — 괜찮을 때와 거짓말할 때

~12 min · csv, format, gotcha

Level 0구경꾼
0 XP0/47 lessons0/11 achievements
0/120 XP to next level120 XP to go0% complete

모두의 포맷, 누구의 것도 아닌 포맷

Comma-separated values 는 지구에서 제일 널리 통하는 데이터 교환 포맷이야. 모든 도구가 읽고, 모든 분석가가 열고, 그런데 진짜 spec 은 없어 (RFC 4180 은 사후에 정리한 기술이지 구속력 있는 표준이 아니야). 그리고 바로 그 만능성 때문에, 앞으로 만질 어떤 포맷보다 CSV 에서 silent corruption 이 제일 많이 나와.

CSV 가 안 담는 것

  • Type. Disk 위에선 전부 string 이야. 읽는 쪽이 매번 추측해야 해: 123 은 정수였을까? 앞자리 0 이 붙은 00123 (미국 ZIP 코드) 이었을까? 2026-04-30 은 날짜였을까 string 이었을까?
  • Encoding. 캐릭터 encoding 이 파일에 안 적혀. UTF-8, Latin-1, Windows-1252 — 전부 valid CSV 야. 잘못 열면 악센트 문자가 mojibake 로 깨져.
  • Schema. 헤더 row 는 있어도 그만 없어도 그만. Column 순서가 유일한 약속이야. Upstream 이 column 하나 추가하면 위치로 참조하던 downstream 코드가 소리 없이 깨져.
  • Quoting 규칙. 값 안의 comma 는 quote 가 필요하고, quoted 값 안의 quote 는 escape 가 필요해. Writer 마다 그 디테일이 미묘하게 달라.
  • 줄 끝. \n vs \r\n vs \r. Windows Excel 은 이거, Linux pandas 는 저거. 대부분은 괜찮아. 가끔은 참사야.

CSV 가 여전히 옳은 선택일 때

CSV 가 괜찮은 경우: 사람이 눈으로 훑는 입력, 팀 간 일회성 전달, 작은 데이터셋 보관, 받는 쪽이 콕 집어 CSV 로 달라는 경우. CSV 가 틀린 경우: 스케줄로 도는 거, 몇백 MB 넘는 거, type 을 안정적으로 왕복시켜야 하는 거, 나중에 join 할 거.

Code

방어적 CSV 읽기 — 모든 가정 명시·python
import pandas as pd

df = pd.read_csv(
    'orders.csv',
    encoding='utf-8',                  # 플랫폼 default 절대 믿지 마
    dtype=str,                          # 일단 다 string
    keep_default_na=False,              # 빈 칸 자동 변환 안 함
    na_values=['', 'NULL', 'N/A'],      # null 로 셀 명시 리스트
    parse_dates=False,                  # 날짜는 별도 단계에서 직접
)

# 의도적으로 cast — 명시적 에러 surface
df['order_id']    = df['order_id'].astype('string[pyarrow]')
df['amount_usd']  = pd.to_numeric(df['amount_usd'].str.replace(',', ''), errors='raise')
df['order_date']  = pd.to_datetime(df['order_date'], format='%Y-%m-%d', errors='raise')

# CSV 로 다시 저장 시도 명시 옵션
df.to_csv(
    'orders_clean.csv',
    index=False,
    encoding='utf-8',
    lineterminator='\n',
)

External links

Exercise

아무 CSV 나 hex 에디터로 열어 봐 (xxd file.csv | head) — 처음 세 줄을 byte 로 보는 거야. 줄 끝을 찾아. Encoding 을 짐작하게 하는 byte (BOM, 악센트 문자) 도 찾아 보고, 필요하면 iconv 로 변환해. 이 연습의 목표는 하나야: CSV 는 그냥 byte 라는 것, 그리고 그 byte 를 안전하게 읽는 데 필요한 metadata 가 그 안에 없다는 것.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.