← 파이썬 강의 목록으로
📈
실습 프로젝트 (Practice) · ★★★★
자동 통계 + 리포트

Lv4 · CSV 데이터 분석 CLI

CSV 파일을 받아 컬럼을 자동 감지 — 숫자는 평균/최대/최소/합계, 문자는 빈도 Top 5. 콘솔과 report.txt 양쪽에 출력합니다.

csvCounter분석
소요 시간
3~5시간
난이도
📊 고급 응용
선수 조건
🎯 고급 8주차 (또는 중급 6주차)
결과물
표준 라이브러리만으로 데이터 분석

이 강의에서 배우는 것

  • 1csv.DictReader 로 CSV 읽기
  • 2컬럼별 데이터 타입 자동 감지
  • 3Counter 로 문자열 빈도 집계

프로젝트 개요

  • 사용법: python solution.py sales.csv
  • 숫자 컬럼: 평균/최대/최소/합계
  • 문자 컬럼: 빈도 Top 5
  • 결과를 콘솔과 report.txt 양쪽 출력

도전 과제

  • 필터 옵션 (--column price --min 10000)
  • matplotlib PNG 차트

채점 체크리스트

  • 타입 자동 감지
  • 리포트 파일 생성
  • 에러 안전

💻 예제 (examples)

실제로 실행해 결과를 확인할 수 있는 예제 코드입니다.

solution.py전체 동작 코드
CODE
"""CSV 자동 분석 — 표준 csv 모듈만 사용"""
import csv
import sys
from collections import Counter
from pathlib import Path

def is_number(s):
    try:
        float(s); return True
    except ValueError:
        return False

def analyze(path):
    with open(path, encoding="utf-8") as f:
        reader = csv.DictReader(f)
        rows = list(reader)
        cols = reader.fieldnames

    if not rows:
        return ["(빈 파일)"]

    out = [f"[행 수] {len(rows)}"]

    for col in cols:
        values = [r[col] for r in rows if r[col] != ""]
        if not values: continue

        if all(is_number(v) for v in values):
            nums = [float(v) for v in values]
            out.append(f"\n[숫자: {col}]")
            out.append(f"  평균: {sum(nums) / len(nums):,.2f}")
            out.append(f"  최대: {max(nums):,.2f}")
            out.append(f"  최소: {min(nums):,.2f}")
            out.append(f"  합계: {sum(nums):,.2f}")
        else:
            counter = Counter(values)
            out.append(f"\n[문자: {col}]")
            for val, cnt in counter.most_common(5):
                out.append(f"  {val:<20} {cnt:>6}")

    return out

def main():
    if len(sys.argv) != 2:
        print("사용법: python solution.py <csv 파일>")
        sys.exit(1)
    path = Path(sys.argv[1])
    if not path.exists():
        print(f"파일 없음: {path}")
        sys.exit(1)

    result = analyze(path)
    text = "\n".join(result)
    print(text)
    Path("report.txt").write_text(text, encoding="utf-8")
    print("\nreport.txt 저장됨")

if __name__ == "__main__":
    main()
▶ 실행 결과
[행 수] 4

[문자: name]
  Alice                     1
  Bob                       1
  Charlie                   1
  Dave                      1

[숫자: score]
  평균: 80.50
  최대: 92.00
  최소: 67.00
  합계: 322.00

report.txt 저장됨

📝 과제 (exercises)

직접 풀어보고, 막힐 때 정답을 펼쳐 비교해보세요.

과제 1

프로젝트 구현

목표: 위 사양대로 직접 작성한다.

요구사항
  • csv.DictReader
  • 타입 자동 감지
  • report.txt 생성
💡 힌트

all(is_number(v) for v in values) 로 숫자 컬럼 판별

입출력 예시
report.txt 저장됨
채점
  • · 타입 감지
  • · 리포트 생성
정답 코드 펼치기 / 접기
SOLUTION
# 위 solution.py 와 동일
▶ 실행 결과
(예제 참고)
예제 코드 / 강의 자료

전체 강의 자료와 예제 코드는 GitHub에서 자유롭게 받아볼 수 있습니다.

GitHub에서 보기 ↗