Skip to Content
💻 코리아IT아카데미 신촌 - 프로그래밍 학습 자료

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의 장점은?

  1. 더 빠르게 읽을 수 있다
  2. 열 이름으로 데이터에 접근할 수 있다
  3. 메모리를 적게 사용한다
  4. 파일 크기가 작아진다

💡 정답 확인

정답: 2번

DictReader를 사용하면 인덱스 대신 열 이름으로 데이터에 접근할 수 있어요!

# 일반 reader row[0] # 인덱스로 접근 # DictReader row['이름'] # 열 이름으로 접근 (더 읽기 쉬움!)

✅ CSV 파일 다루기 마스터 체크리스트

✅ CSV 파일 다루기 마스터 체크리스트

🚀 다음 단계

CSV 파일로 데이터를 다룰 수 있게 되었어요! 마지막으로 파일을 자동으로 정리하는 방법을 배워볼게요!

Last updated on