겉바속촉

[PYTHON] 파이썬_ 데이터 합계 및 평균 구하기 본문

IT 일기 (상반기)/PYTHON

[PYTHON] 파이썬_ 데이터 합계 및 평균 구하기

겉바속촉 2021. 1. 10. 17:35
728x90
반응형

 

 

안녕하세요

겉바속촉입니다

!^^!

 

 

!!파이썬 시작하기!!

 

 

 

 

 

2021/01/05 - [IT 일기 (상반기)/PYTHON] - [PYTHON] 파이썬_파일 읽기

 

[PYTHON] 파이썬_파일 읽기

안녕하세요 겉바속촉입니다 !^^! !!파이썬 시작하기!! 이번에는 파일 읽기에 대해서 알아보도록 하겠습니다 시작 전에 참고할 코드 (요 파일이 계속 등장할 예정) echo.py if __name__ == "__main__" : print("

2-juhyun-2.tistory.com

2021/01/05 - [IT 일기 (상반기)/PYTHON] - [PYTHON] 파이썬_파일쓰기

 

[PYTHON] 파이썬_파일쓰기

안녕하세요 겉바속촉입니다 !^^! !!파이썬 시작하기!! 파일 읽기에 이어서 파일 쓰기에 대해서 알아보도록 하겠습니다 2021/01/05 - [IT 일기 (상반기)/PYTHON] - [PYTHON] 파이썬_파일 읽기 [PYTHON] 파이썬_

2-juhyun-2.tistory.com

 

 

파일 일기, 쓰기 연습해볼 수 있는 실습을

해보도록 하겠습니다

 

 

 

 


 

 

다음 주어진 데이터를 활용할게요:)

 

input.txt

# 월별 생산량 데이터
# 년도  1월    2월     3월    4월    5월    6월     7월    8월    9월    10월    11월   12월     
2010	 9,853 	 4,722 	 9,144 	 4,198 	 4,453 	 6,422 	 4,362 	 1,727 	 8,278 	 8,304 	 3,144 	 5,452 
2011	 1,245 	 6,175 	 5,620 	 3,940 	 5,406 	 6,772 	 4,806 	 7,934 	 5,136 	 217 	 1,285 	 618 
2012	 6,003 	 9,608 	 4,775 	 3,134 	 1,669 	 5,805 	 7,967 	 2,377 	 5,577 	 7,627 	 6,951 	 7,914 
2013	 1,533 	 2,073 	 7,931 	 9,906 	 7,719 	 5,028 	 4,367 	 480 	 1,752 	 1,271 	 6,266 	 8,922 
2014	 8,713 	 9,509 	 8,807 	 2,064 	 6,817 	 938 	 9,738 	 8,203 	 418 	 8,305 	 597 	 711 
2015	 8,366 	 9,272 	 8,193 	 2,264 	 8,701 	 4,881 	 6,407 	 3,588 	 4,462 	 9,823 	 4,435 	 2,051 
2016	 3,236 	 5,953 	 3,597 	 4,034 	 7,866 	 1,178 	 1,317 	 3,544 	 4,384 	 6,880 	 9,014 	 8,342 
2017	 3,952 	 3,613 	 4,336 	 4,951 	 9,791 	 6,641 	 4,541 	 9,760 	 7,541 	 7,779 	 2,408 	 3,219 
2018	 5,855 	 6,262 	 1,894 	 7,926 	 9,014 	 9,863 	 5,854 	 3,651 	 5,903 	 7,633 	 308 	 7,656 
2019	 9,309 	 4,983 	 9,147 	 7,987 	 5,754 	 3,175 	 8,230 	 6,604 	 2,202 	 9,303 	 2,091 	 5,518 
2020	 7,310 	 6,706 	 6,173 	 7,745 	 7,147 	 2,665 	 6,309 	 8,104 	 296 	 3,879 	 1,578 	 1,275

 

 

결과가 다음과 같이 나와야합니다;;;;ㅎㅎㅎㅎ

 

output.txt

 

 

***우선 참고할 내용***

 

한글이 포함된 파일을 읽을 때 아래와 같은 오류가 발생하는 경우 --> 인코딩 방법을 추가!!!

 

Traceback (most recent call last):

  File "c:\python\test.py", line 7, in <module>

    for line in input:

UnicodeDecodeError: 'cp949' codec can't decode byte 0xec in position 2: illegal multibyte sequence

 

open('input.txt', 'r', encoding='UTF-8') as input

 

 

코딩공부하면서 항상 느끼는 건데

라인별로 코드를 읽는 능력이 중요하다고 생각합니다..

 

근데 그게 잘 안되는 것 같아요ㅠㅠㅠ

 

 

 

어쨌든 저런 결과가 나오려면 #라인을 읽어올 필요가 없기때문에 포인터만 넘기면 되겠죠

 

 

 

 

1. 읽기 파일, 쓰기 파일 열기

2. 월별 합계 저장할 리스트 정의

3. 읽기 파일을 라인단위로 읽어주기

#읽기 파일과 쓰기 파일 연다. 
with open('input.txt', 'r', encoding = 'UTF-8') as input, open ('output.txt', 'w') as output:

    #월별 합계를 저장할 리스트를 정의한다.
    m_list = []

    #읽기 파일을 라인 단위로 읽는다. 
    for line in input:
        if line.startswith('#'):
            continue
        print(line)

 

 

여기까지 한 결과

 

 

 

 

4. 데이터들을 이제 필요한 수만 뽑아내기

 

#읽기 파일과 쓰기 파일 연다. 
with open('input.txt', 'r', encoding = 'UTF-8') as input, open ('output.txt', 'w') as output:

    #월별 합계를 저장할 리스트를 정의한다.
    m_list = []

    #읽기 파일을 라인 단위로 읽는다. 
    for line in input:

        #해당 라인이 주석문으로 시작하면 읽지 않는다.
        if line.startswith('#'):
            continue
        print(line)

        m_data = line.split()
        print(m_data)

 

여기까지 해준 결과

 

 

 

5. 이제 리스트 내의 항목들 더한 후에 데이터 리스트 내에 맨 끝에 넣기

 

import re

#읽기 파일과 쓰기 파일 연다. 
with open('input.txt', 'r', encoding = 'UTF-8') as input, open ('output.txt', 'w') as output:

    #월별 합계를 저장할 리스트를 정의한다.
    m_list = []

    #읽기 파일을 라인 단위로 읽는다. 
    for line in input:

        #해당 라인이 주석문으로 시작하면 읽지 않는다.
        if line.startswith('#'):
            continue
     
        m_data = line.split()
        
        sum = 0
        for m in m_data:
            sum = sum + int(re.sub(',','',m))

        m_data.append(sum)

        print(m_data)

 

 

여기까지 실행한 결과

그런데 년도까지 더해진 것 같네요:)

 

그럼 범위를 정해주어야겠쥬

해당 년도의 합계를 계산하는 부분 고칠게요

 

   sum = 0
        for m in m_data[1:]:
            sum = sum + int(re.sub(',','',m))

 

 

그리고 합계부분의 천단위 자리에 콤마도 넣어주려고 합니다

 

m_data.append(format(sum, ','))

 

그래서 나온 실행결과

 

 

6. 해당 년도의 평균 계산 후 리스트에 넣어주기

 

import re

#읽기 파일과 쓰기 파일 연다. 
with open('input.txt', 'r', encoding = 'UTF-8') as input, open ('output.txt', 'w') as output:

    #월별 합계를 저장할 리스트를 정의한다.
    m_list = []

    #읽기 파일을 라인 단위로 읽는다. 
    for line in input:

        #해당 라인이 주석문으로 시작하면 읽지 않는다.
        if line.startswith('#'):
            continue
     
        m_data = line.split()

        
        #해당 년도의 합계를 계산
        sum = 0
        for m in m_data[1:]:
            sum = sum + int(re.sub(',','',m))

        
        #해당 년도의 합계를 리스트에 추가
        m_data.append(format(sum, ','))
        


        #해당 년도의 평균 계산
        avg = sum / 12

        #해당 년도의 평균을 리스트에 추가
        m_data.append(round(avg, 2))
        print(m_data)

 

 

지금까지 결과

오 근데 타입 통일 시키기 위해서 평균을 str로 바꿔줄게요

 

 

7. 대망의 년도별 합계 해주기!!! --> 즉 해당 월의 년도별 합계를 계산해서 마지막 줄에 추가

 

사실 이거 할 때 막연했는데요

아니 해당 월의 데이터들을 뽑은 다음에 맨 아래에 넣고

또 다음 해당 월의 데이터들을 뽑은 다음에 맨아래에 넣고

이걸 어떻게 하지? 했습니다ㅠㅠㅠ

 

근데 항상 라인별로 생각하는 걸 까먹습니다

따로 따로 생각하지 말고 

월별 합계를 저장할 리스트를 처음에 만들어두었잖아요?? 그것을 활용해줍니다

 

 

요렇게요!!

m_list = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

 

월별합계 계산

import re

#읽기 파일과 쓰기 파일 연다. 
with open('input.txt', 'r', encoding = 'UTF-8') as input, open ('output.txt', 'w') as output:

    #월별 합계를 저장할 리스트를 정의한다.
    m_list = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

    #읽기 파일을 라인 단위로 읽는다. 
    for line in input:

        #해당 라인이 주석문으로 시작하면 읽지 않는다.
        if line.startswith('#'):
            continue
     
        m_data = line.split()

        
        #해당 년도의 합계를 계산
        idx = 0
        sum = 0
        for m in m_data[1:]:
            sum = sum + int(re.sub(',','',m))

            #해당 월의 합계와 평균을 위해 각 연도별 월 데이터를 m_list에 추가
            m_list[idx] = m_list[idx] + int(re.sub(',','',m))
            idx = idx + 1

        
        #해당 년도의 합계를 리스트에 추가
        m_data.append(format(sum, ','))
        


        #해당 년도의 평균 계산
        avg = sum / 12

        #해당 년도의 평균을 리스트에 추가
        m_data.append(str(round(avg, 2)))
        
        print(m_list)

       
       

   
    # #읽은 데이터를 불필요한 문자를 제거하고 파싱한다.
    # data = input_file.readline()

    # while data.startswith('#'):
    #     data = input_file.readline()

    # return data


    # # 13개 항목을 차례로 읽는다 
    # # 쓰기 파일에 쓴다. 
    # # 항목을 더한다.
    # # 합계 항목을 쓰기 파일에 쓰고
    # # 합계 항목이 평균을 구해서 쓰기 파일에 쓰고
    # # 다음 줄로 넘긴다.
    # #설명부분 끝나면 데이터들 가져오기
    # month_total = int(data.strip())

    # #다 더하기
    # for data in input_file:
    #     month_total = month_total + int(data.strip())
    #     output_file.write('{}\n' .format(month_total))

    

 

 

여기까지 실행 결과

 

월별 평균 계산

 

import re

#읽기 파일과 쓰기 파일 연다. 
with open('input.txt', 'r', encoding = 'UTF-8') as input, open ('output.txt', 'w') as output:

    #월별 합계를 저장할 리스트를 정의한다.
    m_list = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

    #읽기 파일을 라인 단위로 읽는다. 
    for line in input:

        #해당 라인이 주석문으로 시작하면 읽지 않는다.
        if line.startswith('#'):
            continue
     
        m_data = line.split()

        
        #해당 년도의 합계를 계산
        idx = 0
        sum = 0
        for m in m_data[1:]:
            sum = sum + int(re.sub(',','',m))

            #해당 월의 합계와 평균을 위해 각 연도별 월 데이터를 m_list에 추가
            m_list[idx] = m_list[idx] + int(re.sub(',','',m))
            idx = idx + 1

        
        #해당 년도의 합계를 리스트에 추가
        m_data.append(format(sum, ','))
        


        #해당 년도의 평균 계산
        avg = sum / 12

        #해당 년도의 평균을 리스트에 추가
        m_data.append(str(round(avg, 2)))
        
        print(m_list)

        
        #m_list의 평균
        for i in m_list:
            print(int(i) / 11)

       
       

 

 

이것 저것 고치면서 최종 수정

import re

#읽기 파일과 쓰기 파일 연다. 
with open('input.txt', 'r', encoding = 'UTF-8') as input, open ('output.txt', 'w') as output:

   #월 출력
    # output.write(' ' * 3)
    for i in range(1, 13):
       output.write('{:>10}'.format(i))
    output.write('\n')
   
   
    #월별 합계를 저장할 리스트를 정의한다.
    m_list = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

    #읽기 파일을 라인 단위로 읽는다. 
    for line in input:

        #해당 라인이 주석문으로 시작하면 읽지 않는다.
        if line.startswith('#'):
            continue
     
        
        m_data = line.split()

        #2020 1 2 3 4 5 6 7 8 9 10 11 12 SUM AVG

        
        #해당 년도의 합계를 계산
        idx = 0
        sum = 0
        for m in m_data[1:]:
            sum = sum + int(re.sub(',','',m))

            #해당 월의 합계와 평균을 위해 각 연도별 월 데이터를 m_list에 추가
            m_list[idx] = m_list[idx] + int(re.sub(',','',m))
            idx = idx + 1

        
        #해당 년도의 합계를 리스트에 추가
        m_data.append(format(sum, ','))
        


        #해당 년도의 평균 계산
        avg = sum / 12

        #해당 년도의 평균을 리스트에 추가
        m_data.append(str(round(avg, 2)))      

        #output 파일에 년도별 데이터를 출력
        for d in m_data:
            output.write('{}\t'.format(d))
        output.write('\n')

    #월의 합계를 계산해서 출력
    sum = 0
    output.write(' ' * 10)
    for i in m_list:
        sum = sum + i
        output.write('{:>10,}'.format(i))
    output.write('{:>10}'.format(sum))
    output.write('\n')

    #월의 평균을 계산해서 출력
    output.write(' ' * 10)
    for i in m_list:
        avg = round(int(i) / 11, 2)
        output.write('{}\t'.format(avg))
    output.write('{:>10,.2f}'.format(sum/11))
    output.write('\n')                

        

 

 

 

그래서 최종 결과

 

 

뭔가 이상하게 나왔는데.... 천천히 고쳐나가겠습니다 !^^!

앞으로 수정해나갈 예정!!!

 

 

 

 

728x90
반응형