본문 바로가기
Web/Django

[Web] ExcelCalculate with django for Mac - 5

by skwkiix 2023. 8. 2.
728x90
이 포스팅은 "Django 한그릇뚝딱"의 Chapter4 내용을 실습하며 정리한 내용이다.

파일 업로드 기능 구현


1. 파일 제출

  • main > index.html

"파일 제출" 버튼 클릭 시 이동할 url 설정, form action = "calculate"

<div class="content">
           <div class="fileInputDiv">
               <form action="calculate" method="POST" enctype="multipart/form-data">{% csrf_token %}
                   <div class="input-group">
                      하단 버튼을 통해 파일을 업로드 해주세요.(.xls 확장자의 파일만 가능합니다.)<br>
                       <input id="fileInput" name="fileInput" type="file" class="form-control">
                       <input type="submit" class="btn btn-success btn-lg" value="파일 제출">
                   </div>
               </form>
           </div>
       </div>

 

  • calculate > views.py
def calculate(request):
   file = request.FILES['fileInput']
   print(" #사용자가 등록한 파일의 이름 :", file)
   return HttpResponse("calculate, calculate function")

 

  • 확인

파일 제출 시, 터미널에 정상적으로 파일 이름이 출력됨

파일 이름 정상 출력


 

Pandas library 로 액셀 파일 계산하기


구현할 항목

  • grade 별 최솟값, 최댓값, 평균
  • 이메일 도메인 주소별 인원 수

1. 엑셀파일 불러오기

  • calculate > views.py

pandas 모듈 임포트 한 후, 엑셀파일을 데이터 프레임으로 읽어 온다.

from django.shortcuts import render
from django.http import HttpResponse
import pandas as pd
​
# Create your views here.
def calculate(request):
   # ExcelCalculate > calculate > views.py
   file = request.FILES['fileInput']
   print("# 사용자가 등록한 파일의 이름: ", file)
   df = pd.read_excel(file, sheet_name="Sheet1", header=0)
   print(df.head(5))
   return HttpResponse("calculate, calculate function!")

 

  • 확인

판다스로 불러온 엑셀파일이 잘 출력되는지 확인

2. 계산 구현하기

grade 별 최솟값, 최댓값, 평균 / 이메일 도메인 주소별 인원 수

  • calculate > views.py
from django.shortcuts import render
from django.http import HttpResponse
import pandas as pd
​
# Create your views here.
def calculate(request):
   # ExcelCalculate > calculate > views.py
   file = request.FILES['fileInput']
   print("# 사용자가 등록한 파일의 이름: ", file)
   df = pd.read_excel(file, sheet_name="Sheet1", header=0)
   #print(df.head())
​
   # grade별 value 리스트 만들기 
   grade_dic = {} # 빈 딕셔너리 생성
   total_row_num = len(df.index)
   # print(total_row_num)
​
   for i in range(total_row_num):
       data = df.loc[i, :]
       if not data.grade in grade_dic.keys():
           grade_dic[data.grade] = [data.value]
       else:
           grade_dic[data.grade].append(data.value)
   # print(grade_dic)
​
   grade_calculate_dic = {}
   for key in grade_dic.keys():
       grade_calculate_dic[key] = {}
       grade_calculate_dic[key]['min'] = min(grade_dic[key]) # 각 grade별 최소값 ex) grade 1의 최소값
       grade_calculate_dic[key]['max'] = max(grade_dic[key]) # 각 grade별 최대값
       grade_calculate_dic[key]['avg'] = float(sum(grade_dic[key])) / len(grade_dic[key])
​
   # print(grade_calculate_dic)
​
   # 결과 출력
   grade_list = list(grade_calculate_dic.keys())
   # print("")
   # print(grade_list)
   grade_list.sort()
   # print(grade_list)
   for key in grade_list:
       print("# grade: ", key)
       print("min:", grade_calculate_dic[key]['min'], end="")
       print("/ max:", grade_calculate_dic[key]['max'], end="")
       print("/ avg:", grade_calculate_dic[key]['avg'], end="\n\n")
​
  
 # 이메일 주소 도메인별 인원 구하기
   email_domain_dic = {}
   for i in range(total_row_num):
       data = df.loc[i, :]
       # print(data.email)
       email_domain = data['email'].split("@")[1] # 새로운 변수
       if not email_domain in email_domain_dic.keys():
           email_domain_dic[email_domain] = 1 # 새로운 도메인이 나타나면 1 숫자 부여
       else:
           email_domain_dic[email_domain] += 1 # 기존 도메인이 또 나타나면 +1 숫자 추가 (Count)
​
   print("## Email 도메인별 사용 인원")
   for key in email_domain_dic.keys():
       print("#", key, ": ", email_domain_dic[key], "명")
​
   return HttpResponse("calculate, calculate function!")

 

  • 확인

터미널

 

728x90