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
'Web > Django' 카테고리의 다른 글
[Web]ExcelCalculator with django for Mac - 4 (0) | 2023.08.02 |
---|---|
[Web] ExcelCalculate with django for Mac - 3 (0) | 2023.08.01 |
[Web] ExcelCalculate with django for Mac - 2 (0) | 2023.07.31 |
[Web] ExcelCalculate with django for Mac - 1 (0) | 2023.07.31 |
[Web] django로 Todolist 만들기 for Mac - 4 (0) | 2023.07.28 |