Repository navigation
Expand file tree
/
Copy pathcsvEx1.py
More file actions
62 lines (50 loc) · 2.38 KB
/
Copy pathcsvEx1.py
File metadata and controls
62 lines (50 loc) · 2.38 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# CSV 읽기 — 표준 라이브러리 csv 모듈만 씁니다 (설치 불필요)
# data/scores.csv : 12명의 학년·반·3과목 점수
import csv
print('---------- reader : 각 줄이 리스트 ----------')
with open('data/scores.csv', 'r', encoding='utf-8') as f:
reader = csv.reader(f)
header = next(reader) # 첫 줄은 제목
print('헤더 :', header)
for row in reader:
print(row) # ['홍길동', '1', '1', '85', '73', '68']
break # 한 줄만 보고 멈춤
print('---------- DictReader : 각 줄이 딕셔너리 ----------')
# 헤더를 키로 써 준다. step05 의 "리스트 안의 딕셔너리" 가 바로 나온다!
with open('data/scores.csv', 'r', encoding='utf-8') as f:
students = list(csv.DictReader(f))
print('인원 :', len(students))
print('첫 명 :', students[0])
print('---------- 주의 : 전부 문자열이다 ----------')
first = students[0]
print(type(first['국어']), repr(first['국어'])) # <class 'str'> '85'
# print(first['국어'] + first['영어']) # '8573' — 문자열 연결!
print('숫자로 바꿔야 계산됨 :', int(first['국어']) + int(first['영어']))
# step02_operator/parseInt.py 에서 배운 그대로입니다.
print('---------- 숫자로 변환해서 담기 ----------')
subjects = ['국어', '영어', '수학']
rows = []
for s in students:
row = {'이름': s['이름'], '학년': int(s['학년']), '반': int(s['반'])}
for sub in subjects:
row[sub] = int(s[sub])
rows.append(row)
print(rows[0])
print('---------- 집계 ----------')
for r in rows:
r['총점'] = sum(r[sub] for sub in subjects)
r['평균'] = round(r['총점'] / len(subjects), 2)
top = max(rows, key=lambda r: r['평균'])
print(f"최고 : {top['이름']} 평균 {top['평균']}")
print('전체 평균 :', round(sum(r['평균'] for r in rows) / len(rows), 2))
print('---------- 학년별 평균 ----------')
by_grade = {}
for r in rows:
by_grade.setdefault(r['학년'], []).append(r['평균'])
# setdefault : 키가 없으면 빈 리스트를 넣고, 그 리스트를 돌려준다
for grade in sorted(by_grade):
avgs = by_grade[grade]
print(f'{grade}학년 ({len(avgs)}명) 평균 {sum(avgs)/len(avgs):.2f}')
print('---------- 과목별 평균 ----------')
for sub in subjects:
print(f'{sub} : {sum(r[sub] for r in rows)/len(rows):.2f}')