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

CSV — DictReader / DictWriter / quoting

~18 min · csv, dictreader, dictwriter, quoting

Level 0호기심
0 XP0/93 lessons0/23 achievements
0/100 XP to next level100 XP to go0% complete

두 reader/writer 패턴

csv 모듈이 각 연산의 두 맛 줘. csv.reader / csv.writer 가 list 로서의 row 와 작동. csv.DictReader / csv.DictWriter 가 헤더 줄 키로 dict 로서의 row 와 작동. Dict 변형이 거의 항상 원하는 거 — 코드가 컬럼 인덱스보다 필드 이름으로 더 잘 읽혀.

newline 인자 — 항상 초보 거는 거

CSV 파일은 항상 newline='' 으로 열어. CSV 파일은 자기 줄바꿈 컨벤션 가지고 있고 Python 의 텍스트 모드 줄바꿈 변환이 간섭. 빈 문자열이 변환 비활성화 — csv 모듈이 자기 거 처리. 까먹으면 Windows 에서 빈 row 추가 또는 멀티라인 셀 망가짐.

Quoting — 콤마와 줄바꿈이 셀 안에 숨을 때

CSV 의 핵심 기능 — 셀이 콤마, 줄바꿈, 따옴표 포함 가능. 셀 주위 따옴표가 그 글자들 박는 걸 허용. 따옴표 안 더블 따옴표 = 리터럴 따옴표. csv 모듈이 다 처리 — 사용해야만. "콤마로 split" 직접 짜지 마.

dialect 파라미터 — 다른 CSV 가 다른 거

Excel 이 , 구분자. 유럽 Excel 은 종종 ;. 일부 도구는 \t (TSV). dialect 인자 또는 delimiter/quotechar/quoting kwarg 로 처리. csv.Sniffer 가 샘플에서 dialect 추측 가능.

주의: 데이터가 100KB 넘고 약간의 특이점 있으면 pandas.read_csv 로 전환이 보통 맞음. stdlib csv 는 작은 파일 + 코드 많은 처리용, pandas 는 대량 데이터 작업용.

Code

DictReader — row 를 dict 로·python
import csv
import io

data = '''name,age,role
alice,30,admin
bob,25,member
charlie,35,member'''

# 데모용 문자열 읽기, 파일 객체와도 같음
reader = csv.DictReader(io.StringIO(data))
for row in reader:
    print(row)
# {'name': 'alice', 'age': '30', 'role': 'admin'}
# {'name': 'bob', 'age': '25', 'role': 'member'}
# {'name': 'charlie', 'age': '35', 'role': 'member'}

# 주의 — 모든 값이 문자열, 필요 시 수동 변환
rows = list(csv.DictReader(io.StringIO(data)))
for row in rows:
    row["age"] = int(row["age"])
DictWriter — dict 에서 row 쓰기·python
import csv
import io

rows = [
    {"name": "alice", "age": 30, "role": "admin"},
    {"name": "bob", "age": 25, "role": "member"},
]

buf = io.StringIO()
writer = csv.DictWriter(buf, fieldnames=["name", "age", "role"])
writer.writeheader()
writer.writerows(rows)

print(buf.getvalue())
# name,age,role
# alice,30,admin
# bob,25,member
진짜 파일에서 읽기 — newline=''·python
import csv

# Python CSV 파일엔 항상 newline=''
with open("/tmp/users.csv", "w", newline="", encoding="utf-8") as f:
    writer = csv.DictWriter(f, fieldnames=["name", "age"])
    writer.writeheader()
    writer.writerow({"name": "alice", "age": 30})
    writer.writerow({"name": "bob", "age": 25})

with open("/tmp/users.csv", newline="", encoding="utf-8") as f:
    for row in csv.DictReader(f):
        print(row)
Quoting — 콤마와 따옴표 가진 셀·python
import csv
import io

rows = [
    {"name": "alice", "note": "hello, world"},          # 콤마 있음
    {"name": "bob", "note": 'she said "hi"'},          # 따옴표
    {"name": "charlie", "note": "line1\nline2"},        # 줄바꿈
]

buf = io.StringIO()
writer = csv.DictWriter(buf, fieldnames=["name", "note"])
writer.writeheader()
writer.writerows(rows)

print(buf.getvalue())
# name,note
# alice,"hello, world"
# bob,"she said ""hi"""           — 리터럴 따옴표는 더블
# charlie,"line1
# line2"                            — 줄바꿈 때문에 quote

# csv 가 다 처리. CSV 손으로 쓰지 마.
다른 dialect — TSV 등·python
import csv
import io

data = '''name\tage\trole
alice\t30\tadmin
bob\t25\tmember'''

# 탭 구분 — delimiter 변경
for row in csv.DictReader(io.StringIO(data), delimiter="\t"):
    print(row)

# csv.Sniffer 가 추측
sniffer = csv.Sniffer()
dialect = sniffer.sniff(data[:200])
print("검출된 delimiter:", repr(dialect.delimiter))

External links

Exercise

책 (title, author, year, price) 의 dict 셋 list. csv.DictWriter + newline=''/tmp/books.csv 에 쓰기. 최소 한 title 에 콤마, 최소 하나에 em-dash 또는 다른 유니코드. csv.DictReader 로 다시 읽고 모든 레코드가 원본 매치 (CSV 가 모든 값 문자열로 — year + price 다시 변환).

Progress

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

댓글 0

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

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