2025. 11. 13. 21:03ㆍTIL
오늘은 기초 파이썬 강의가 끝나는 날이다.
파이썬을 이용해 (pandas와 같은 라이브러리 없이) 일련의 데이터 전처리 과정을 수행하는 것이 오늘 수업 내용이었다.
학생들의 과목별 성적이 있는 csv 파일을 불러와 이름, 평균, 합격 여부를 담은 리스트로 바꾸고, json 파일로 내보낸다.
이번에 사용한 csv 데이터는 다음과 같다.
# school_scores.csv
name,kor,eng,math
Hannah,90,95,85
Minjun,80,88,92
Yujin,75,85,100
Dohyeok,100,70,88
Suyun,88,90,93
Jiwon,95,97,99
Hojun,65,75,60
Yuna,78,82,85
Taeyang,92,89,91
Seojin,55,70,68
name은 학생의 이름이고, kor, eng, math는 각각 국어, 영어, 수학 점수를 의미한다.
우리는 이 파일을 이용해, 학생별 평균 점수를 구하고 80점 이상인 학생은 합격, 미만인 학생은 불합격으로 처리하고 싶다.
그렇다면 어떤 논리 구조를 따라가며 코드를 작성해야 할 지 한 단계씩 진행해 보겠다.
1) 파일 불러오기
import csv
import json
with open("school_scores.csv", "r", encoding="utf-8") as f:
reader = csv.DictReader(f)
student = list(reader)
파일을 불러올 때는 with 명령문을 사용해 안의 실행문이 끝나면 자동으로 닫혀 오류가 나지 않도록 만든다.
파일을 open할 때는 다양한 모드를 선택할 수 있다.
| "w" | 쓰기 모드 (기존 내용 삭제) |
| "r" | 읽기 모드 |
| "a" | 쓰기 모드 (기존 내용에 추가) |
| "b" | 바이너리 모드 |
| "t" | 텍스트 모드 (기본값) |
csv.DictReader는 csv 파일을 첫 행을 key로 한 딕셔너리의 집합으로 변환시켜준다.
csv.DictReader로 변환한 딕셔너리 모음을 리스트로 만들어 student라는 변수에 추가한다.

현재 코드까지 진행된 사항을 보면, csv 파일의 각 행이 csv 파일의 첫 행을 key로 하는 딕셔너리로 저장된 것을 확인할 수 있다.
2) 이름, 평균, 합격 여부 계산 함수 만들기
def analyze_scores(scores):
try: # 예외 처리
kor = int(scores["kor"])
eng = int(scores["eng"])
math = int(scores["math"])
avg = (kor + eng + math) / 3
if avg >= 80:
status = "합격"
else:
status = "불합격"
except Exception as e:
print(f"에러 발생, {e}")
return {"name":scores["name"], "avg":avg, "status":status}
다음으로 학생 별 평균 점수를 계산하고, 합/불 여부를 판단하는 함수를 만든다.
위의 student 변수의 결과를 보면, 딕셔너리의 모든 값이 문자열로 되어 있는 것을 알 수 있다.
따라서 평균 계산을 위해 모든 value들을 정수형으로 바꿔야 한다.
그다음 평균값을 계산하고, 평균값 조건에 따라 status 변수에 합격 또는 불합격을 넣어준다.
try exception을 통해 예외처리를 해주는데, 만약 함수 매개변수로 들어온 딕셔너리의 값에 문제가 있을 경우, 에러를 발생시켜 해당 데이터를 수정하면 된다.
함수의 return 값은 "name", "avg", "status"를 key로 하는 scores["name"], avg, status value들로 구성된 딕셔너리이다.
주의할 점은 이 함수는 student의 한 원소(한 딕셔너리)씩만 처리할 수 있다는 것이다.
3) 이름, 평균, 합격 여부 리스트 만들기
results = []
for s in student:
r = analyze_scores(s)
if r:
results.append(r)
student는 리스트이기 때문에, for문을 이용해 반복하며 analyze_scores 함수를 하나씩 적용한다.
그런 다음 결과를 results라는 리스트에 하나씩 append해준다.
results = [analyze_scores(s) for s in student]
리스트 컴프리헨션으로 간단히 작성할 수도 있다.

현재까지의 진행 결과, 각각의 학생별 평균 점수와 합격/불합격 여부가 딕셔너리로 잘 들어가 있는 것을 알 수 있다.
4) json 파일로 내보내기
with open("results.json", "w", encoding="utf-8") as f:
json.dump(results, f, ensure_ascii=False, indent=4)
print("파일이 완성되었습니다.")
파일로 내보내기 위해서도 with open 명령어를 사용해야 한다.
이번에는 파일에 쓸 것이기 때문에, "w"(쓰기)로 json 파일을 열어준다.
json 파일에 내용을 쓰기 위해서는 json 라이브러리의 dump라는 메서드를 사용해야 한다.
그러면 results 리스트를 results.json 파일(f로 별칭을 정한)에 ensure_ascii=False, indent(들여쓰기)=4의 조건으로 쓰게 된다.
결과를 보면 다음과 같다.

JSON 파일에 result 리스트의 내용이 잘 들어간 것을 확인할 수 있다.
5) 결론
이번 파이썬 수업을 통해 파이썬을 이용해 데이터를 불러오고, 전처리한 뒤 새로운 데이터 파일로 저장하는 법을 배울 수 있었다.
물론 pandas나 다른 라이브러리를 이용해 더 쉽게 데이터를 처리할 수 있지만, 데이터 전처리의 논리 흐름이 어떻게 흘러가는지에 대해 이해할 수 있었다. 또한 파이썬에서 가장 중요한 자료 구조인 리스트, 딕셔너리와 그들을 다루는 조건문/반복문을 어떻게 써야 하는지에 대해 배웠고, 추후 데이터 분석을 할 때 적용할 수 있게 많이 복습해야 할 것 같다.
'TIL' 카테고리의 다른 글
| 251117_BootCamp Day 21_파이썬 데이터프레임의 이해 (0) | 2025.11.17 |
|---|---|
| 251114_BootCamp Day 20_QGIS를 이용한 공간 데이터 분석 (0) | 2025.11.14 |
| 251112_BootCamp Day 18_파이썬 라이브러리 (0) | 2025.11.12 |
| 251111_BootCamp Day 17_컴프리헨션, 예외처리 (0) | 2025.11.11 |
| 2511110_BootCamp Day 16_EDA (1) | 2025.11.10 |