파일을 줄별로 저장할 때 - 예시

from openpyxl import *
from openpyxl.styles import Font, Alignmnet
from openpyxl.utils import get_column_letter


# excel sheet 시작하기
wb = Workbook()

# sheet 만들기 (기본적으로 1개 제공 추가 만들기)
worksheet = wb.create_sheet(sheetname)

# sheet 1개 더 만들기
worksheet1 = wb.create_sheet(sheetname1)

# field 이름 설정하기
field_name = ['이름', '나이', '주소', '연락처']

# field width 설정하기
field_width = ['10', '5', '30', '20']

# 특정 넣을 값을 만드는 로직 추가
member_list = Member.objects.all()


# 먼저 field 설정해주기 

for i, head in enumerate(field_name):
    # cell(1)을 해줘야지 가장 위에 줄에 입력해준다.
    # 해당 필드의 width 설정해주기
    worksheet.column_dimensions[get_column_letter(i + 1)].width = field_width[i]
    # 해당 필드의 값 주기
    worksheet.cell(1, i + 1).value = head
    # 폰트 설정해주기
    worksheet.cell(1, i + 1).font = Font(name='맑은 고딕', size=13, bold=True)
    # 폰트 위치 설정해주기 (정중앙정렬)
    worksheet.cell(1, i + 1).alignment = Alignment(horizontal='center', vertical='center')


# 해당 field들에게 값 주기
for i, data in enumerate(member_list):
    # i + 2를 해줘야지 2번째 줄부터 입력해준다.
    worksheet.cell(i + 2, 1).value = data.name
    worksheet.cell(i + 2, 2).value = data.age
    worksheet.cell(i + 2, 3).value = data.address
    worksheet.cell(i + 2, 4).value = data.phone


# 가장 기본적으로 셋팅되어 있는 sheet 삭제
wb.remove(wb['Sheet'])

# 저장하기
wb.save('member_name.xlsx')

 

파일을 읽어서 처리할 때 - 예시

 

import openpyxl


def open_pyxl():
    not_matching_membmer = []
    multiple_member = []
    what_error = []
    
    coupon = Coupon.objects.get(id=636)
    success_count = 0


    wb = openpyxl.load_workbook('account.xlsx')  # 해당 파일 불러오기
    ws = wb.active # 활성화 시트가지져오기
    wr = ws.rows # 열별로 가져오기 한줄 한줄 가져오기
    for i in wr:
        try:
            account = i[0].value (해당 줄의 첫 번째 행의 값 가져오기)
            member = Member.objects.get(account=account)
            coupon.issue([member])
            print('coupon _issue success : ', member.id, ' id: ', member.account)
            success_count += 1
        except Member.DoesNotExist:
            not_matching_membmer.append(account)
        except Member.MultipleObjectsReturned:
            multiple_member.append(account)
        except Exception as e:
            dict = {}
            dict[account] = str(e)
            what_error.append(dict)


    print('성공 갯수 :', success_count, '매칭 맴버 x : ', not_matching_membmer, '중복 멤버 :',
          multiple_member, '알 수 없는 에러 :', what_error)

 

2019.03.20 TIL

(TIL은 스스로 이해한 것을 바탕으로 정리한 것으로 오류가 있을 수 있습니다)

# 질문에 답하기.

  1. if name == "main" 의 의미에 대해 설명

openpyxl

openpyxl은 python에서 엑셀을 불러오기 위해 설치해야 하는 모듈이다.

openpyxl 기본 용어 정리

  1. Workbook 관련

    • openpyxl.Workbook() ---> 새 엑셀 임시 파일 생성
    • openpyxl.load_workbook("파일명") ---> 기존 엑셀 파일 로드
    • Workbook.save("파일명") ---> 엑셀 파일 저장
  2. Worksheet 타입 관련

    • wb.active ---> 현재 활성화된 시트 반환
    • wb.create_sheet("시트명") ---> 새 시트 생성
    • wb['시트명'] ---> 이름으로 시트 접근
  3. 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)

openpyxl데이터

원하는 데이터 출력 모습

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)

평균, 분산, 표준편차

원하는 것

  1. 평균
  2. 분산
  3. 표준편차
  4. 인터프리터로 실행하여 뽑아내기

실행코드

>>> 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에서 자료 불러오기

  1. 불러 올 excel파일을 작성 중인 파이썬 자료의 폴더안에 함께 넣어놓는다.
  2. 사이드패키지
    • excel파일이 python3의 site-package안에 들어가면 해당 폴더에 없어도 실행된다.
  3. 경로지정해주기
    • export PYTHONPATH = "해당 자료의 경로" 를 통해 해당경로를 지정해준다.

새롭게 알게 된 사실

파이썬에서의 for문

  1. for i in range(1,11) ---> 1부터 10까지의 숫자가 하나하나 i에 들어간다.
  2. for i in li ---> li의 0번째 인덱스부터 하나하나 들어간다.
    • javascript에서는 인덱스 0부터 포문에 들어갔던거 같은데 그 생각을 버려야 겠다.
  3. 파이썬에서의 구구단 설계 (단 4줄로 설계가능하다)
>>>for i in range(2,10):
>>>        for j in range(1, 10):
>>>            print(i * j, end = " ") #각 항마다 실행
>>>        print(" ") 
>>>

+ Recent posts