겉바속촉
[PYTHON] 파이썬_ 데이터 합계 및 평균 구하기 본문
안녕하세요
겉바속촉입니다
!^^!
!!파이썬 시작하기!!
2021/01/05 - [IT 일기 (상반기)/PYTHON] - [PYTHON] 파이썬_파일 읽기
2021/01/05 - [IT 일기 (상반기)/PYTHON] - [PYTHON] 파이썬_파일쓰기
파일 일기, 쓰기 연습해볼 수 있는 실습을
해보도록 하겠습니다
다음 주어진 데이터를 활용할게요:)
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')
그래서 최종 결과
뭔가 이상하게 나왔는데.... 천천히 고쳐나가겠습니다 !^^!
앞으로 수정해나갈 예정!!!
'IT 일기 (상반기) > PYTHON' 카테고리의 다른 글
[PYTHON] 파이썬_CSV 활용하기 (feat.아파트시세조회) (0) | 2021.01.10 |
---|---|
[PYTHON] 파이썬_CSV (0) | 2021.01.10 |
[PYTHON] 파이썬_크롤링 실행 파일 (0) | 2021.01.08 |
[PYTHON] 파이썬_크롤링 (0) | 2021.01.08 |
[PYTHON] 파이썬_객체 지향 이론 (0) | 2021.01.07 |