-
[파이썬] 엑셀로 텍스트 파일 만들어 평균 구하기프로그래밍/Python 2020. 5. 9. 16:29
엑셀로 텍스트 파일을 만들어 이를 리스트로 받아 평균을 구한 후,
다시 텍스트 파일로 데이터를 옮겨주는 프로그램을 만들어보겠습니다.
엑셀 데이터 -> 텍스트 파일
엑셀 데이터를 텍스트 파일로 만들어볼거에요.
엑셀에는 이름과 국어, 수학, 영어, 과학의 성적을 넣고, 이를 텍스트 형식으로 저장할 겁니다.
우선 엑셀을 켜주세요.
위와 같이 처리할 데이터 값들을 넣어주세요.
저장할 때 유의하셔야해요.
일반 엑셀 확장자인 xlsx가 아닌 텍스트(탭으로 분리)(*.txt)로 저장해주셔야합니다.
텍스트 파일을 열어보면 위 사진과 같이 탭을 기준으로 데이터가 나열된 것을 확인할 수 있습니다.
파이썬 소스 (평균 처리)
전체적인 프로그램은
- 파일 입력, 출력을 위해 파일을 열어준다.
- 파일로부터 데이터를 리스트로 받아온다.
- 데이터를 이름과 성적으로 분류한다.
- 성적으로 평균을 구한다.
- 이름과 평균을 다시 리스트에 나열한다.
- 파일에 입력한다.
- 파일들을 종료한다.
위와 같이 진행됩니다.
전체 소스코드
# 파일 입력을 위한 코드 file = open("시험성적.txt", 'r') # 파일 출력을 위한 코드 file2 = open('시험평균.txt', 'w') #수행 전 처리 / 첫 줄을 지워주기 위한 코드 lines = file.readlines() lines.pop(0) # 전체 결과물을 담을 리스트 content = [] # 반복문으로 각 줄을 처리 for line in lines: process = line.split() # 한 줄을 공백을 기준으로 분리하여 리스트에 저장 name = process.pop(0) # 첫 번째 원소는 이름이므로, 분리하여 저장 score = list(map(int, process)) # 점수들을 정수형으로 변환하여 저장 avg = sum(score)/len(score) # 평균을 계산하여 저장 / sum(score)는 합계, len(score)는 과목 수 content.extend([name, '\t',str(avg),'\n']) # 이름, 평균 순으로 파일을 나열 # 파일에 결과물을 출력 file2.writelines(content) #파일 종료 file.close() file2.close()
먼저 평균을 처리하는 소스입니다. 지금부터 한 구간씩 설명하겠습니다.
파일 입출력
# 파일 입력을 위한 코드 file = open("시험성적.txt", 'r') # 파일 출력을 위한 코드 file2 = open('시험평균.txt', 'w')
파일 두개를 file과 file2 변수에 열어줍니다.
file은 시험 성적을 가져오기 위해 파일을 열고,
file2는 처리한 평균을 저장하기 위해 파일을 엽니다.
상단 문자열 삭제
#첫 줄을 지워주기 위한 코드 lines = file.readlines() lines.pop(0)
readlines()로 파일의 내용을 줄별로 가져옵니다.
lines에 파일 내용을 받은 후,
lines lines[0] | "이름\t국어\t수학\t영어\t과학" lines[0] | "홍길동\t90\t70\t75\t70" lines[1] | "이순신\t75\t50\t95\t100" lines[2] | "김유신\t80\t80\t82\t75" lines[3] | "대조영\t85\t90\t75\t70" lines[4] | "이성계\t85\t85\t70\t70" 텍스트 파일의 상단 부분에는
이름, 국어, 수학, 영어"이름\t국어\t수학\t영어\t과학" 이라는 값의 라벨들이 적혀있기에,
이 부분은 평균으로 구할 때 제외하고, 처리하는 것이 편리하다고 생각이 들어 지워줍니다.
pop() 메서드를 사용하여, 인덱스 0번의 데이터인 이름, 국어, 수학, 영어, 과학을 지웁니다.
lines lines[0] | "홍길동\t90\t70\t75\t70" lines[1] | "이순신\t75\t50\t95\t100" lines[2] | "김유신\t80\t80\t82\t75" lines[3] | "대조영\t85\t90\t75\t70" lines[4] | "이성계\t85\t85\t70\t70" 결과물 리스트 생성
# 전체 결과물을 담을 리스트 content = []
평균을 구한 후에 "이름\t평균\n"이런 형식으로 파일에 담을 예정입니다.
반복문을 통한 평균 처리
# 반복문으로 각 줄을 처리 for line in lines: process = line.split() # 한 줄을 공백을 기준으로 분리하여 리스트에 저장 name = process.pop(0) # 첫 번째 원소는 이름이므로, 분리하여 저장 score = list(map(int, process)) # 점수들을 정수형으로 변환하여 저장 avg = sum(score)/len(score) # 평균을 계산하여 저장 / sum(score)는 합계, len(score)는 과목 수 content.extend([name, '\t',str(avg),'\n']) # 이름, 평균 순으로 파일을 나열
반복문을 사용하여 각 리스트 요소에 대한 평균을 구해보겠습니다.
lines lines[0] | "홍길동\t90\t70\t75\t70" lines[1] | "이순신\t75\t50\t95\t100" lines[2] | "김유신\t80\t80\t82\t75" lines[3] | "대조영\t85\t90\t75\t70" lines[4] | "이성계\t85\t85\t70\t70" lines에서 line으로 하나씩 받아오게 됩니다.
가장 먼저 "홍길동\t\t90\t70\t75\t70" 이 값을 받아오게됩니다.
대표적으로 인덱스 0번의 값으로 예를 들겠습니다.
line | "홍길동\t90\t70\t75\t70" process = line.split() # 한 줄을 공백을 기준으로 분리하여 리스트에 저장
line에 담긴 값을 공백을 기준으로 나누어 리스트 형식으로 process 저장됩니다.
process[0] process[1] process[2] process[3] process[4] "홍길동" "90" "70" "75" "70" process 리스트에는 위와 같이 적혀있습니다.
평균을 구하기 위해서는 이름을 따로 분리해주는 것이 연산에 편리할 것 입니다.
name = process.pop(0) # 첫 번째 원소는 이름이므로, 분리하여 저장
pop() 메서드를 사용하여 인덱스 값을 반환 후 삭제합니다.
process[0] process[1] process[2] process[3] "90" "70" "75" "70" 리스트가 위와 같이 성적만 남게 됩니다.
하지만, 위 리스트의 성적은 문자열이므로 연산을 하기위해 int형으로 바꿔줍니다.
score = list(map(int, process)) # 점수들을 정수형으로 변환하여 저장
process[0] process[1] process[2] process[3] 90 70 75 70 map()함수를 사용하여 process의 모든 값을 정수형으로 바꾸어 score라는 리스트에 저장하게됩니다.
# 평균을 계산하여 저장 / sum(score)는 합계, len(score)는 과목 수 avg = sum(score)/len(score)
sum() 함수와 len()함수를 사용하여 평균을 계산해줍니다.
sum(시퀀스) | 시퀀스형 자료 안의 값을 모두 더하여 반환합니다. sum(score) # return 90+70+75+70
len(시퀀스) | 시퀀스형 자료 안의 요소의 수를 헤아려 반환합니다. len(score) # return 4
content.extend([name, '\t',str(avg),'\n']) # 이름, 평균 순으로 파일을 나열
아까 분리해둔 이름과 평균을 리스트로 만들어 content 리스트와 결합해줍니다.
이 연산을 반복하여 수행하여, 평균을 담은 리스트를 만듭니다.
파일에 결과물 출력
# 파일에 결과물을 출력 file2.writelines(content)
지금까지 content에 입력된 내용들을 파일에 write 해줍니다.
파일 닫아주기
#파일 종료 file.close() file2.close()
파일을 열어줬으니, 사용 후에 닫아줍니다.
결과 확인
이 후 파일을 열어 확인해보시면
이름과 평균이 출력되는 것을 확인할 수 있습니다.
반응형'프로그래밍 > Python' 카테고리의 다른 글
[Python] requests 모듈 (0) 2022.07.13 [파이썬] 세탁소 사장 동혁 - 백준 2720번 (0) 2022.05.06 [파이썬] 전자레인지 - 백준 10162번 (0) 2022.05.06 [파이썬] 리스트로 평균 구하기 (0) 2022.02.19