1 - 1. 계기
이 프로젝트를 시작하게 된 것은 최근에 영양사로 취업한 아기 직장인 친구 때문이었다. 어느 날 친구가 연락이 와서, 주별로 영양소를 계산해야 하는데 자료정리가 힘들다고 했다. 식에 따라서 평균 필요량, 권장 섭취량 등 계산할 거리가 좀 있었는데 이제까지 하나하나 따로 계산해 엑셀파일에 적어 넣었다고 한다. 핸드메이드 엑셀...😭
최근에 <컴퓨터구조> 수업에서 배운 인터페이스의 정의가 떠올랐다. 인터페이스(interface)란 사용자가 디바이스 내부 하드웨어의 복잡성을 모르더라도 원하는 기능을 수행할 수 있게 해주는 것이다. 굉장히 멋진 말이라는 생각이 들었다. 나도 친구에게 편리한 프로그램을 만들어주고 싶어졌다. 그래서 데이터만 입력하면 결과를 출력해주는 프로그램을 만들어보고자 했다!
1 - 2. 기획
주요 기능은 탄단지 비율과 일주일의 영양소 데이터를 입력하면 평균 필요량, 권장 섭취량, 주별 평균 섭취량과 에너지를 계산해주는 것이다. 탄단지 비율은 직접 입력받고 일주일 영양소 데이터는 엑셀 파일로 입력받을 것이다. 원래도 엑셀을 이용하고 있었고 5x10의 데이터를 받기에는 엑셀이 적절하다는 생각이 들었다. 이렇게 하여 입력받아야 할 것은 1. 파일 이름 2. 탄단지 비율 3. 일주일 영양소 데이터가 되었다. 큰 기능은 아니지만 작고 소중한 프로그램이 되어보기로...
2 - 1.
먼저, 프로그램을 만들 수 있는 환경을 세팅하기 위해
터미널에서 pandas, openpyxl, xlrd를 설치한다.
pip install pandas
pip install openpyxl
pip install xlrd
이 단계에서 엑셀 파일을 가공하게 좋게 포멧을 정리한다.
2 - 2.
import pandas as pd
df = pd.read_excel('파일명')
먼저 Dataframe 형식으로 엑셀 파일을 읽어온다.
Pandas에는 Series와 Dataframe 형식이 있다.
- Series: 테이블의 열과 같다. 모든 유형의 데이터를 보유하는 1차원 배열.
- DataFrame: 2차원 배열 또는 행과 열이 있는 테이블과 같은 2차원 데이터 구조.
2 - 3.
평균 필요량, 권장 섭취량을 먼저 계산해 배치한다.
df.loc[행, 열] = 값
행과 열 자리에는 행과 열의 index와 제목(이름) 모두 사용 가능하다.
아주 편리한 점은, df.loc[df['순위']==1, : ]처럼
순위가 1위인 행을 찾아서 모든 열을 가지고 온다 등의 조건 사용도 가능하다는 것.
day_data = pd.read_excel('파일명',usecols='범:위')
파일에서 범위를 지정해 계산할 데이터만 읽어온다.
- read_excel()의 parameters:
week = str(day_data.sum(axis=1)).split()
- axis = 1 : 가로로 더한다
- axis = 0 : 세로로 더한다
for i in range(1, 21, 2):
amount+= [week[i]]
week에 인덱스가 같이 들어가서 값만 배열에 다시 저장해주었다.
왠지 sum()의 parameter를 활용해 자연스럽게 빼는 방법이 있을 것 같다.
for i in amount:
result+= [round(float(i)/5,1)]
평균을 구해서 결과 리스트에 추가해주었다.
이렇게 보니 이것도 왠지 더 깔끔하게 줄일 수 있을 것 같다는 생각이 든다.
2 - 4.
for i in range(10):
df.loc[행, 열] = round(result[i], 1)
df.to_excel('파일명', index = False)
계산 결과를 저장 후 엑셀로 내보내기 해준다.
os.rename('파일명', 'updated_' + '파일명')
업데이트 여부가 헷갈리지 않게 파일명도 바꿔준다.
2 - 5. 예외처리
코드를 실행 파일로 만드는 과정에서 조언을 얻어 예외처리의 필요성을 배웠다. 예외처리는 오류가 발생했을 때 프로그램이 의도치 않게 종료되는 것을 막기 위해서 필요한 작업이다. 파이썬에서는 try: exept: 코드로 쉽게 예외처리를 할 수 있다. try:에 위에서 짠 코드를 넣고 exept:에는 오류 메시지를 출력하도록 한다. 이렇게 하면 오류가 발생했을 때, 사용자가 오류의 원인을 파악하기에 더 쉽다. 나는 여기서 사용자가 오류 메시지와 함께 출력되는 설명을 충분히 읽을 수 있게, 전체 코드에 while True를 적용하고 'y'(다시 입력)가 입력되면 continue하고 n(프로그램 종료)이 입력되면 break하도록 했다.
3 - 1. 후기
이렇게 쥐똥만한(?) 프로그램을 만드는 데에도 오류가 곳곳에서 나고 시간이 생각보다 걸리는구나... 라는 깨달음을 얻었다. 이 정도는 금방 하겠지~ 라고 생각했던 나를 매우치고 싶다. 어서 공부를 더 해서 실력부족으로 인한 시간낭비를 줄여야겠다는 생각이 들었다. 그리고 여전히 잔실수가 잦다. 그러나 교수님께서 엔지니어에게 실수라는 건 없다고 말씀하셨기 때문에(실수가 아니라 잘못이라고 하심) 나의 부족함이라는 것을 받아들이고 연습해서 프로그래밍에도 익숙해지고 완성형에 가까워지도록 노력해야겠다.
무엇보다 이번 프로젝트의 메인은 엑셀 파일의 데이터를 적절히 가져와 처리하고 내보내는 것이었는데, 새삼 Pandas 라이브러리의 유용함도 느끼고 라이브러리 공부의 필요성도 많이 느끼게 되었다. 파이썬은 아는 라이브러리와 함수가 많은 게 굉장히 큰 자산이 되는 것 같다. 그리고 pyinstall을 사용해서 exe 파일을 만드는 과정에서 여러 테스트를 해보며 예외처리를 해야 한다는 것을 배웠다. 프로그램이 돌아가기만 하면 된다고 생각했는데, 실제로 사용될 때의 상황도 미리 고려해서 처리를 유예해야 할 때도 있고 프로그램을 지속시키거나 종료시켜야 한다는 것을 알게 되었다.
이렇게 처음으로 토이 프로젝트를 해보니 여러가지 느낀 점이 많았다. 하는 동안 잘 몰라서 답답했던 때도 있었지만 즐겁게 코딩했던 것 같다. 혼자서 책과 인터넷을 찾아보고 마인드맵처럼 이어지는 공부를 하는 것도 유익하다고 느꼈다. 책 한 권을 붙들고 돌파하는 것도 좋지만 이런 실습형 공부도 참 좋은 것 같다. 그리고 다음에는 팀 프로젝트를 해보고 싶다는 생각이 들었다!
3 - 2. 수정하고 싶은 점
- 파일명을 입력받아 파일을 찾는 방식이, 실행 파일과 엑셀 파일이 같은 경로에 있지 않을 때 문제가 생길 것 같다. 사용자가 직접 open_file로 원하는 파일을 선택할 수 있게 하면 좋겠다.
- 파일명에 공백이나 한글이 들어가는 경우에 대한 확인
- 영양소별 주 섭취량을 더할 때 읽어오는 방식을 더 간결하게 작성할 수 있을 것 같아 수정하고 싶다.
- 엑셀 파일의 형식이 조금 달라져도 어느 정도 인식해서 데이터를 읽어올 수 있었으면 좋겠다.
'활동' 카테고리의 다른 글
| [토이] NVMeVirt Timeline Prototype (0) | 2025.11.20 |
|---|---|
| [2024-2] 2024 대구를 빛내는 SW 해커톤 (4) | 2025.02.18 |
| [2024-1] 2024 GLOW 해커톤 (0) | 2025.02.12 |
| 2024 대구 공공데이터 활용 도로관리 효율화 해커톤 (2) | 2025.02.11 |
| [2023-2] 👩🏻💻 앱동 동아리 활동 (3) | 2024.12.07 |