Topic 3: CSV 파일 다루기 📊
🎯 학습 목표
표 형태의 데이터를 다루는 CSV 파일을 배워요!
- CSV 파일이 무엇인지 이해하기
- CSV 파일 읽고 쓰기
- 실용적인 데이터 처리하기
📊 CSV란?
CSV(Comma-Separated Values)는 콤마로 구분된 값들이에요. 엑셀의 간단한 버전이라고 생각하면 돼요!
이름,나이,도시
김철수,25,서울
이영희,23,부산
박민수,27,대구
이런 형태로 데이터를 저장해요. 엑셀에서도 열 수 있어요! 📈
📖 CSV 파일 읽기
1. csv 모듈 사용하기
import csv
# CSV 파일 읽기
with open("students.csv", "r", encoding="utf-8") as file:
csv_reader = csv.reader(file)
# 첫 줄은 헤더(제목)
header = next(csv_reader)
print(f"항목: {header}")
# 나머지는 데이터
for row in csv_reader:
print(f"{row[0]}님은 {row[1]}살이고, {row[2]}에 살아요.")
2. DictReader로 편하게 읽기
import csv
# 딕셔너리 형태로 읽기
with open("students.csv", "r", encoding="utf-8") as file:
csv_reader = csv.DictReader(file)
for row in csv_reader:
print(f"{row['이름']}님은 {row['나이']}살입니다.")
훨씬 읽기 쉽죠? 😊
✏️ CSV 파일 쓰기
1. 기본 방법
import csv
# 학생 데이터
students = [
["이름", "국어", "수학", "영어"],
["김철수", 85, 90, 88],
["이영희", 92, 88, 95],
["박민수", 78, 85, 82]
]
# CSV 파일로 저장
with open("scores.csv", "w", encoding="utf-8", newline="") as file:
csv_writer = csv.writer(file)
# 모든 줄 한 번에 쓰기
csv_writer.writerows(students)
print("성적표가 저장되었어요!")
2. DictWriter로 깔끔하게 쓰기
import csv
# 상품 목록
products = [
{"상품명": "사과", "가격": 1000, "재고": 50},
{"상품명": "바나나", "가격": 800, "재고": 30},
{"상품명": "오렌지", "가격": 1200, "재고": 25}
]
# CSV 파일로 저장
with open("products.csv", "w", encoding="utf-8", newline="") as file:
fieldnames = ["상품명", "가격", "재고"]
csv_writer = csv.DictWriter(file, fieldnames=fieldnames)
# 헤더 쓰기
csv_writer.writeheader()
# 데이터 쓰기
csv_writer.writerows(products)
💪 실용적인 예제
성적 분석 프로그램
import csv
def analyze_scores(filename):
"""CSV 파일에서 성적을 분석하는 함수"""
students = []
with open(filename, "r", encoding="utf-8") as file:
csv_reader = csv.DictReader(file)
for row in csv_reader:
# 점수를 숫자로 변환
student = {
"이름": row["이름"],
"국어": int(row["국어"]),
"수학": int(row["수학"]),
"영어": int(row["영어"])
}
# 평균 계산
student["평균"] = (student["국어"] + student["수학"] + student["영어"]) / 3
students.append(student)
# 전체 평균 계산
total_avg = sum(s["평균"] for s in students) / len(students)
print("📊 성적 분석 결과")
print("=" * 30)
for student in students:
print(f"{student['이름']}: 평균 {student['평균']:.1f}점")
print("=" * 30)
print(f"전체 평균: {total_avg:.1f}점")
# 최고 성적 학생
top_student = max(students, key=lambda x: x["평균"])
print(f"🏆 최우수: {top_student['이름']} ({top_student['평균']:.1f}점)")
# 사용 예시
analyze_scores("scores.csv")
가계부 만들기
import csv
from datetime import datetime
def add_expense(category, amount, description=""):
"""지출 내역을 CSV에 추가하는 함수"""
filename = "expenses.csv"
# 파일이 없으면 헤더 추가
try:
with open(filename, "r", encoding="utf-8") as f:
pass
except FileNotFoundError:
with open(filename, "w", encoding="utf-8", newline="") as f:
writer = csv.writer(f)
writer.writerow(["날짜", "카테고리", "금액", "설명"])
# 지출 내역 추가
with open(filename, "a", encoding="utf-8", newline="") as file:
writer = csv.writer(file)
date = datetime.now().strftime("%Y-%m-%d")
writer.writerow([date, category, amount, description])
print(f"✅ {category}: {amount:,}원 지출 기록됨")
def show_summary():
"""지출 요약을 보여주는 함수"""
try:
with open("expenses.csv", "r", encoding="utf-8") as file:
csv_reader = csv.DictReader(file)
categories = {}
total = 0
for row in csv_reader:
category = row["카테고리"]
amount = int(row["금액"])
categories[category] = categories.get(category, 0) + amount
total += amount
print("\n💰 지출 요약")
print("=" * 30)
for category, amount in sorted(categories.items()):
print(f"{category}: {amount:,}원")
print("=" * 30)
print(f"총 지출: {total:,}원")
except FileNotFoundError:
print("아직 지출 내역이 없어요!")
# 사용 예시
add_expense("식비", 8000, "점심")
add_expense("교통비", 1400, "지하철")
add_expense("문화", 15000, "영화")
show_summary()
🔄 CSV ↔ 리스트 변환
# 리스트를 CSV로
data = [
["과일", "가격"],
["사과", "1000"],
["바나나", "800"]
]
with open("fruits.csv", "w", encoding="utf-8", newline="") as f:
csv.writer(f).writerows(data)
# CSV를 리스트로
with open("fruits.csv", "r", encoding="utf-8") as f:
data = list(csv.reader(f))
print(data)
💡 퀴즈: CSV 이해도 체크
Q1. CSV 파일에서 newline=""를 사용하는 이유는?
💡 정답 확인
정답: 빈 줄이 생기는 것을 방지하기 위해서!
Windows에서 CSV 파일을 쓸 때 newline=""
를 사용하지 않으면
줄마다 빈 줄이 추가될 수 있어요.
# 올바른 방법
with open("data.csv", "w", encoding="utf-8", newline="") as f:
csv.writer(f).writerows(data)
Q2. DictReader의 장점은?
- 더 빠르게 읽을 수 있다
- 열 이름으로 데이터에 접근할 수 있다
- 메모리를 적게 사용한다
- 파일 크기가 작아진다
💡 정답 확인
정답: 2번
DictReader를 사용하면 인덱스 대신 열 이름으로 데이터에 접근할 수 있어요!
# 일반 reader
row[0] # 인덱스로 접근
# DictReader
row['이름'] # 열 이름으로 접근 (더 읽기 쉬움!)
✅ CSV 파일 다루기 마스터 체크리스트
✅ CSV 파일 다루기 마스터 체크리스트
🚀 다음 단계
CSV 파일로 데이터를 다룰 수 있게 되었어요! 마지막으로 파일을 자동으로 정리하는 방법을 배워볼게요!
Last updated on