ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [파이썬] 엑셀로 텍스트 파일 만들어 평균 구하기
    프로그래밍/Python 2020. 5. 9. 16:29

     

    엑셀로 텍스트 파일을 만들어 이를 리스트로 받아 평균을 구한 후,

    다시 텍스트 파일로 데이터를 옮겨주는 프로그램을 만들어보겠습니다. 

     

     

     

     엑셀 데이터 -> 텍스트 파일  

     

    엑셀 데이터를 텍스트 파일로 만들어볼거에요.

    엑셀에는 이름과 국어, 수학, 영어, 과학의 성적을 넣고, 이를 텍스트 형식으로 저장할 겁니다.

     

     

    우선 엑셀을 켜주세요.

     

     

    위와 같이 처리할 데이터 값들을 넣어주세요.

     

     

    저장할 때 유의하셔야해요.

    일반 엑셀 확장자인 xlsx가 아닌 텍스트(탭으로 분리)(*.txt)로 저장해주셔야합니다.

     

     

    텍스트 파일을 열어보면 위 사진과 같이 탭을 기준으로 데이터가 나열된 것을 확인할 수 있습니다.

     

     

     

     

     파이썬 소스 (평균 처리)  

     

    전체적인 프로그램은

    1. 파일 입력, 출력을 위해 파일을 열어준다.
    2. 파일로부터 데이터를 리스트로 받아온다.
    3. 데이터를 이름과 성적으로 분류한다.
    4. 성적으로 평균을 구한다.
    5. 이름과 평균을 다시 리스트에 나열한다.
    6. 파일에 입력한다.
    7. 파일들을 종료한다.

    위와 같이 진행됩니다.

     

     

     

    전체 소스코드

    # 파일 입력을 위한 코드
    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()

    파일을 열어줬으니, 사용 후에 닫아줍니다.

     

     

     

     결과 확인  

    이 후 파일을 열어 확인해보시면

    이름과 평균이 출력되는 것을 확인할 수 있습니다.

     

    반응형
Designed by Tistory.