40 — 보고서 — 요약 파일 쓰기
JSON 파일 하나는 한 종류의 데이터를 담고, 보고서는 여러 데이터를 합칩니다.
이 가이드는 점수 파일과 선수 파일을 읽어 짧은 요약 — 평균, 최고 득점자,
팀별 선수 수 — 을 계산하고, 35 가이드의 파일쓰기로
report.txt 하나에 씁니다.
단계
데이터 파일 두 개를 만듭니다.
scores.json은 각 선수를 점수와 묶고,players.json은 각 선수를 팀과 묶습니다:
실행해 보기 →[ {"name": "미나", "score": 7}, {"name": "사나", "score": 9}, {"name": "준호", "score": 5} ][ {"name": "미나", "team": "서울"}, {"name": "사나", "team": "부산"}, {"name": "준호", "team": "서울"} ]각 파일은 딕셔너리들의 목록입니다. 38 가이드의
questions.json과 똑같습니다.name키가 서로 맞아떨어져 두 파일이 같은 선수들에 관한 것임을 알려 줍니다.14 가이드의
json읽기로 두 파일을 불러옵니다. 호출 두 번, 목록 두 개:
실행해 보기 →파일 사용 최신 점수들 = json읽기("scores.json") 선수들 = json읽기("players.json") 말해 f"점수 {len(점수들)}개와 선수 {len(선수들)}명을 불러왔습니다"점수 3개와 선수 3명을 불러왔습니다가 출력됩니다.for반복으로 점수를 훑어 합계와 최고 득점자를 찾습니다.최고점수비교가 지금까지 본 가장 큰 값을 기억합니다:
실행해 보기 →합계 = 0 최고이름 = "" 최고점수 = -1 for p in 점수들: 합계 = 합계 + p["score"] if p["score"] > 최고점수: 최고점수 = p["score"] 최고이름 = p["name"] 평균 = 합계 / len(점수들)30 가이드의 달리는 합계와 달리는 최댓값 패턴을, 이번에는 숫자 대신 딕셔너리를 훑으면서 쓴 것입니다.
딕셔너리로 팀별 선수 수를 셉니다. 처음 보는 팀은 1부터 시작하고, 다시 보는 팀은 하나씩 늘어납니다:
실행해 보기 →팀별 = {} for p in 선수들: 팀 = p["team"] if 팀 in 팀별: 팀별[팀] = 팀별[팀] + 1 else: 팀별[팀] = 1보고서를 줄 목록으로 만들고
"\n".join(줄들)로 잇습니다.파일쓰기("report.txt", 내용)이 긴 글 전체를 한 번에 저장합니다 — 35 가이드가 일기 메모를 저장한 바로 그 도우미입니다:
실행해 보기 →줄들 = [] 줄들.append("경기 보고서") 줄들.append("선수 수: " + str(len(선수들))) 줄들.append("평균 점수: " + str(평균)) 줄들.append("최고 득점자: " + 최고이름 + " (" + str(최고점수) + "점)") for 팀 in sorted(팀별): 줄들.append(팀 + ": " + str(팀별[팀]) + "명") 내용 = "\n".join(줄들) 파일쓰기("report.txt", 내용)sorted(팀별)이 팀을 일정한 순서로 보여 줍니다 — 39 가이드의 정렬된 숫자와 같습니다.전체 프로그램을 한 파일에 담습니다.
report.ko.nme로 저장합니다:
실행해 보기 →# 보고서: JSON 데이터 파일 두 개를 읽어 요약 파일 하나를 쓰기 # 실행: nme 실행 report.ko # scores.json과 players.json 파일이 같은 폴더에 있어야 합니다. 파일 사용 최신 점수들 = json읽기("scores.json") 선수들 = json읽기("players.json") 말해 f"점수 {len(점수들)}개와 선수 {len(선수들)}명을 불러왔습니다" 합계 = 0 최고이름 = "" 최고점수 = -1 for p in 점수들: 합계 = 합계 + p["score"] if p["score"] > 최고점수: 최고점수 = p["score"] 최고이름 = p["name"] 평균 = 합계 / len(점수들) 팀별 = {} for p in 선수들: 팀 = p["team"] if 팀 in 팀별: 팀별[팀] = 팀별[팀] + 1 else: 팀별[팀] = 1 줄들 = [] 줄들.append("경기 보고서") 줄들.append("선수 수: " + str(len(선수들))) 줄들.append("평균 점수: " + str(평균)) 줄들.append("최고 득점자: " + 최고이름 + " (" + str(최고점수) + "점)") for 팀 in sorted(팀별): 줄들.append(팀 + ": " + str(팀별[팀]) + "명") 내용 = "\n".join(줄들) 파일쓰기("report.txt", 내용) 말해 "report.txt를 만들었습니다:" 말해 내용실행하고, 프로그램이 쓴 파일을 봅니다:
nme 실행 report.ko cat report.txt점수 3개와 선수 3명을 불러왔습니다 report.txt를 만들었습니다: 경기 보고서 선수 수: 3 평균 점수: 7.0 최고 득점자: 사나 (9점) 부산: 1명 서울: 2명경기 보고서 선수 수: 3 평균 점수: 7.0 최고 득점자: 사나 (9점) 부산: 1명 서울: 2명콘솔과 파일에 같은 보고서가 보입니다. 한 프로그램이 데이터 파일 두 개를 읽을 수 있는 요약 하나로 바꿨습니다.
영어는
use file latest,json_load,file_write를 씁니다. 전체 영어 프로그램은 영어 가이드에 있습니다.
직접 해보기
JSON 파일 두 개에 선수 한 명씩을 추가하고 report.ko.nme를 다시
실행해 보세요. 숫자와 평균이 함께 바뀝니다. 그런 다음 최고점수 비교처럼
최저점수를 추적해 줄들.append("최저 점수: ...") 줄을 추가해 보세요.
배운 것
json읽기가 JSON 파일 하나마다 각각의 딕셔너리 목록으로 읽습니다.- 달리는 합계와 달리는 최댓값을 가진
for반복이 점수를 요약합니다. - 딕셔너리가 팀별 선수 수 같은 그룹을 셉니다.
파일쓰기("report.txt", 내용)이 여러 줄 보고서 전체를 한 번에 저장합니다.- 데이터 파일은 데이터로 남고, 프로그램이 그것을 보고서로 만듭니다.