여기서는 텍스트 파일이라는 공통점보다 데이터가 중첩 구조인지, 행과 열이 분명한 표인지를 먼저 봅니다.
dict/list 기반 계층 구조라면 JSON, 각 행이 같은 열 구조를 가지는 표라면 CSV가 먼저입니다.
빠른 비교
import csv
import json
from pathlib import Path
config = {"name": "Mina", "active": True}
Path("config.json").write_text(
json.dumps(config, ensure_ascii=False, indent=2),
encoding="utf-8",
)
with Path("users.csv").open("w", newline="", encoding="utf-8") as file:
writer = csv.DictWriter(file, fieldnames=["name", "age"])
writer.writeheader()
writer.writerow({"name": "Mina", "age": 26})기본 흐름
기본형은 JSON 문자열 변환, JSON 파일 변환, CSV 읽기, CSV 쓰기까지 같이 보면 됩니다.
import csv
import json
text = json.dumps(data, ensure_ascii=False)
data = json.loads(text)
json.dump(data, file, ensure_ascii=False, indent=2)
data = json.load(file)
reader = csv.DictReader(file)
writer = csv.DictWriter(file, fieldnames=["name", "age"])JSON은 구조를 직렬화하는 쪽에 가깝고, CSV는 행 단위 표 데이터를 읽고 쓰는 쪽에 가깝습니다.
형식 선택
중첩 구조 데이터면 JSON, 행과 열 중심 데이터면 CSV다
JSON은 dict/list 기반의 계층 구조를 담기 좋습니다. 설정 파일, API 응답 저장, 직렬화된 데이터 교환에 자주 맞습니다.
config = {
"user": {"name": "Mina", "roles": ["admin", "writer"]},
"active": True,
}즉 "키-값 구조가 안쪽으로 더 들어간다"면 CSV보다 JSON이 자연스럽습니다.
2) 행과 열 중심 데이터면 CSV
CSV는 각 행이 같은 열 구조를 가진 표 데이터에 잘 맞습니다. 엑셀, 통계 도구, 간단한 데이터 교환에서 자주 보입니다.
rows = [
{"name": "Mina", "age": 26},
{"name": "Jin", "age": 21},
]즉 JSON은 구조, CSV는 표라고 보면 빠릅니다.
JSON 흐름
JSON은 dumps/loads와 dump/load 짝으로 읽는다
문자열 기준이면 dumps() / loads(), 파일 객체 기준이면 dump() / load()입니다.
이 짝만 기억해도 API 이름은 거의 안 헷갈립니다.
import json
text = json.dumps({"ok": True})
data = json.loads(text)문자열을 직접 다룰지, 열린 파일 객체를 다룰지에 따라 API가 갈린다고 보면 됩니다.
CSV 흐름
CSV는 DictReader와 DictWriter가 열 이름을 드러내서 더 읽기 쉽다
CSV는 열 순서보다 열 이름이 중요한 경우가 많아서 DictReader, DictWriter가 훨씬 명확합니다.
import csv
with open("users.csv", newline="", encoding="utf-8") as file:
reader = csv.DictReader(file)
for row in reader:
print(row["name"], row["age"])인덱스로 row[0], row[1]를 읽는 것보다 컬럼 이름이 그대로 보이는 쪽이 유지보수에 유리합니다.
주의 지점
CSV 쓰기에서는 newline="", JSON 쓰기에서는 UTF-8과 ensure_ascii=False를 같이 본다
CSV는 겉보기엔 단순하지만 개행 처리, 헤더 유무, 구분자 설정이 같이 붙습니다.
특히 쓰기 모드에서는 newline=""를 빠뜨리면 운영체제에 따라 빈 줄이 끼는 문제가 생길 수 있습니다.
주의할 점
CSV를 쓸 때 newline=""를 빼면 운영체제에 따라 빈 줄이 끼는 문제가 생길 수 있습니다.
# ❌ newline 생략
with open("users.csv", "w", encoding="utf-8") as file:
writer = csv.writer(file)
writer.writerow(["name", "age"])
# ✅ csv 모듈 권장 방식
with open("users.csv", "w", newline="", encoding="utf-8") as file:
writer = csv.writer(file)
writer.writerow(["name", "age"])# ✅ JSON을 사람이 읽는 파일로 남길 때는 UTF-8과 ensure_ascii=False를 같이 두는 편이 안전하다
with open("config.json", "w", encoding="utf-8") as file:
json.dump({"name": "미나"}, file, ensure_ascii=False, indent=2)참고 링크
2 sources