2019.03.20 TIL
(TIL은 스스로 이해한 것을 바탕으로 정리한 것으로 오류가 있을 수 있습니다)
# 질문에 답하기.
- if name == “main” 의 의미에 대해 설명
- 3.
openpyxl
openpyxl은 python에서 엑셀을 불러오기 위해 설치해야 하는 모듈이다.
openpyxl 기본 용어 정리
- Workbook 관련
- openpyxl.Workbook() —> 새 엑셀 임시 파일 생성
- openpyxl.load_workbook(“파일명”) —> 기존 엑셀 파일 로드
- Workbook.save(“파일명”) —> 엑셀 파일 저장
- Worksheet 타입 관련
- wb.active —> 현재 활성화된 시트 반환
- wb.create_sheet(“시트명”) —> 새 시트 생성
- wb[‘시트명’] —> 이름으로 시트 접근
- cell 타입 관련 접근
- ws[‘b1’] —> <Cell ‘Sheet1’.B1>
- ws[‘b1’].value —> b1의 실제 값 반환
- ws.cell(row=2, column=1) —> <Cell ‘Sheet1’.A2>
- ws.cell(row=2, column=1).value —> 2번째 행의 첫번째 열 값 반환(A2)
- ws.append([‘이름’, ‘나이’, ‘직업’) —> 시트의 마지막 행에 새행 추가
- g = ws.rows —> 그 줄에 있는 값을 g에 넣음 (lazy로 next를 통해 값 실행)
OPENPYXL 모듈로 데이터 읽어 들이기
해당 엑셀 데이터의 모습(exam.xlsx)
원하는 데이터 출력 모습
student_data = [ {‘name’ = greg, ‘math’ = 95, ‘literature’ = 65, ‘science’ = 75} ,
{‘name’ = greg, ‘math’ = 25, ‘literature’ = 30, ‘science’ = 55}, …. ]
실행코드
>>> import openpyxl
>>> wb = openpyxl.load_workbook("exam.xlsx")
>>> ws = wb.active
>>> wr = ws.rows
>>> g = next(wr) #제일 위에 wr 한줄을 가져옴
>>> li = []
>>> for i in g:
>>> li.append(i.value)
>>> # li = ['name', 'math', 'literature', 'science']
>>> keys = []
>>> for j in wr:
>>> dic = { k : v.value for k, v in zip(li, j) }
>>> keys.append(dic)
>>>
>>> print(keys)
OPENPYXL을 통해 평균 및 분산, 표준편차 구하기
해당 데이터 모습(class_1)
원하는 것
- 평균
- 분산
- 표준편차
- 인터프리터로 실행하여 뽑아내기
실행코드
>>> import openpyxl
>>> import math
>>>
>>> def get_data_from_excel(filename):
>>> """
>>> get_data_from_excel(filename) --> {'name1': 'scores1', 'name2':'scores2' ....}
>>> """
>>> dic = {}
>>> wb = openpyxl.load_workbook(filename)
>>> ws = wb.active
>>> wr = ws.rows
>>>
>>> for name, score in wr:
>>> dic[name.value] = score.value
>>>
>>> return dic
>>>
>>> #scores = list(dic.values())
>>> #scores = [95, 25, 50, 15, 100, 10, 25, 80, 95, 20]
>>>
>>> def average(scores):
>>> s = 0
>>> for score in scores:
>>> s += score
>>> aveg = round(s/len(scores), 1)
>>> return aveg
>>>
>>> def variance(scores, aveg):
>>> s = 0
>>> for score in scores:
>>> s += (score - aveg)**2
>>> var = round(s/len(scores), 1)
>>> return var
>>>
>>> def std_dev(var):
>>> return round(math.sqrt(var),1)
>>>
>>> if __name__ == "__main__":
>>> raw_data = get_data_from_excel("class_1.xlsx")
>>> scores = list(raw_data.values())
>>> avrg = average(scores)
>>> variance = variance(scores, avrg)
>>> standard_deviation = std_dev(variance)
>>> print("평균 : {}, 분산:{}, 표준편차: {}".format(avrg, variance, standard_deviation))
초보몽키님 실행코드 참고하기(by reduce, map)
# 평균
def average(scores):
return reduce(lambda a, b: a + b, scores)/len(scores)
# 분산
def variance(scores, avrg):
return reduce(lambda a, b: a + b, map(lambda s:(s-avrg)**2, scores))/len(scores)
import openpyxl에서 자료 불러오기
- 불러 올 excel파일을 작성 중인 파이썬 자료의 폴더안에 함께 넣어놓는다.
- 사이드패키지
- excel파일이 python3의 site-package안에 들어가면 해당 폴더에 없어도 실행된다.
- 경로지정해주기
- export PYTHONPATH = “해당 자료의 경로” 를 통해 해당경로를 지정해준다.
새롭게 알게 된 사실
파이썬에서의 for문
- for i in range(1,11) —> 1부터 10까지의 숫자가 하나하나 i에 들어간다.
- for i in li —> li의 0번째 인덱스부터 하나하나 들어간다.
- javascript에서는 인덱스 0부터 포문에 들어갔던거 같은데 그 생각을 버려야 겠다.
- 파이썬에서의 구구단 설계 (단 4줄로 설계가능하다)
>>>for i in range(2,10):
>>> for j in range(1, 10):
>>> print(i * j, end = " ") #각 항마다 실행
>>> print(" ")
>>>