C.W.K.
Stream
Lesson 01 of 06 · published

CSV — OK 인 때와 거짓말하는 때

~12 min · csv, format, gotcha

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

CSV 는 모두가 가졌고 아무도 안 가진 포맷

Comma-separated values 는 지구상 가장 universal 한 데이터 교환 포맷. 모든 도구가 읽고, 모든 분석가가 열고, 진짜 spec 도 없어 (RFC 4180 은 사후 description, binding 표준 아님). 그 universality 가 정확히 CSV 가 다루게 될 어떤 포맷보다 byte 당 silent 데이터 corruption 을 가장 많이 만드는 이유야.

CSV 가 안 담는 것

  • Type. 모든 게 disk 에 string. 누가 읽든 추측해야 해: 123 이 정수였나? 앞 0 있는 00123 (US ZIP 코드) 였나? 2026-04-30 이 날짜였나 string 이었나?
  • Encoding. 캐릭터 encoding 이 파일에 저장 안 돼. UTF-8, Latin-1, Windows-1252 — 다 valid CSV. 잘못 열면 악센트가 mojibake 돼.
  • Schema. 헤더 row 가 optional. Column 순서가 유일한 contract. Upstream 에서 column 추가하면 position 참조하는 downstream 코드가 silent 하게 깨져.
  • Quoting 규칙. 값 안의 comma 는 quote 필요. Quoted 값 안의 quote 는 escape 필요. Writer 들이 디테일에서 disagree.
  • 줄 끝. \n vs \r\n vs \r. Windows Excel 은 하나, Linux pandas 는 다른 거. 대부분 OK; 가끔 catastrophic.

CSV 가 여전히 옳은 선택일 때

CSV 가 OK 인 경우: 사람-eyeballable 입력, 팀 간 일회성 transfer, 작은 데이터셋 archival, audience 가 명시적으로 요구하는 경우. CSV 가 틀린 경우: 스케줄로 도는 거, 몇백 MB 넘는 거, type 을 안정적으로 round-trip 해야 하는 거, 나중에 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-suggest 하는 byte 찾아 (BOM, 악센트 문자). 필요하면 iconv 로 변환. 이 연습의 목표는 CSV 가 그냥 byte 라는 거 — 그리고 그 byte 가 안전히 읽게 해주는 metadata 를 안 포함한다는 거 — 느끼는 거야.

Progress

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

댓글 0

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

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