파이썬
[파이썬] 성적관리 프로그램
jackypark
2022. 7. 28. 23:07
import pickle as p
def inputStudent():
e=readStudent()
print("추가할 학생정보 입력:")
name=input('이름입력: ')
department=input('학과 입력: ')
while True:
fflag=0
studentNum=input('학번 입력: ')
for i in range(len(e)):
if e[i].get('학번')==studentNum:
print('존재하는 학번입니다 다시 입력 바람')
fflag=1
if fflag==1:
continue
else:
break
kor=int(input('국어 성적입력: '))
eng=int(input('영어 성적입력: '))
math=int(input('수학 성적입력: '))
stuSum=sum([kor,eng,math])
avg="{:.2f}".format(stuSum/3)
avgg=float(avg)
x={'이름':name,'학과':department,'학번':studentNum,'국어':kor,'영어':eng,'수학':math,'총점':stuSum,'평균':avgg}
##x={studentNum:{'이름':name,'학과':department,'학번':studentNum,'국어':kor,'영어':eng,'수학':math,'총점':stuSum,'평균':avg}}
with open('db.txt','ab')as file:
p.dump(x,file)
def readStudent(): ## 학생정보를 읽어올 함수
with open('db.txt','rb')as file:
x=[]
while True:
try:
data = p.load(file)
except EOFError:
break
x.append(data)
##for k,v in data.items():
## x.setdefault(k,v)
return x
def ScoreStudent(): ## 학생정보를 성적순으로 정렬시켜서 출력시킬 함수
rr=[]
print('성적순 출력')
e=readStudent()
rr=sorted(e,key=lambda x:x['평균'],reverse=True)
##rr=sorted(e.items(),key=lambda x:x[1].get('평균'),reverse=True)
for i in range(len(rr)):
print(rr[i])
def searchInfo(): ## 학생 정보 검색 할 함수
c=int(input("1. 이름검색 2. 학과검색 3. 성적검색"))
e=readStudent()
if c==1:
name=input('검색하실 이름을 입력하시오..')
for i in range(len(e)):
if e[i].get('이름') == name:
print(e[i])
elif c==2:
depart=input('검색하실 학과을 입력하시오..')
for i in range(len(e)):
if e[i].get('학과') == depart:
print(e[i])
elif c==3:
c2=int(input('1.국어성적 2.영어성적 3.수학성적.'))
if c2==1:
score=int(input('국어성적 몇점이상 출력?'))
rr=sorted(e,key=lambda x:x['국어'],reverse=True)
for i in range(len(rr)):
if rr[i].get('국어') >= score:
print(rr[i])
elif c2==2:
score=int(input('영어성적 몇점이상 출력?'))
rr=sorted(e,key=lambda x:x['영어'],reverse=True)
for i in range(len(rr)):
if rr[i].get('영어') >= score:
print(rr[i])
elif c2==3:
score=int(input('수학성적 몇점이상 출력?'))
rr=sorted(e,key=lambda x:x['수학'],reverse=True)
for i in range(len(rr)):
if rr[i].get('수학') >= score:
print(rr[i])
def modifyInfo(): ##학생정보 수정할 함수
stuNum=input('수정할 학번을 입력하세요')
e=readStudent()
flag=0
for i in range(len(e)):
if e[i].get('학번')==stuNum:
print(e[i])
d=e[i]
flag=1
if flag==0:
return print('학번 존재하지않음')
elif flag==1:
num=int(input('1.국어성적변경 2. 영어성적변경 3. 수학 성적변경'))
if num==1:
score=int(input('국어 몇점으로 변경?'))
d.update(국어=score)
d.update(총점=sum([d.get('국어'),d.get('영어'),d.get('수학')]))
avg="{:.2f}".format(d.get('총점')/3)
avgg=float(avg)
d.update(평균=avgg)
changer(e)
elif num==2:
score=int(input('영어 몇점으로 변경?'))
d.update(영어=score)
d.update(총점=sum([d.get('국어'),d.get('영어'),d.get('수학')]))
avg="{:.2f}".format(d.get('총점')/3)
avgg=float(avg)
d.update(평균=avgg)
changer(e)
elif num==3:
score=int(input('수학 몇점으로 변경?'))
d.update(수학=score)
d.update(총점=sum([d.get('국어'),d.get('영어'),d.get('수학')]))
avg="{:.2f}".format(d.get('총점')/3)
avgg=float(avg)
d.update(평균=avgg)
changer(e)
else:
return print('잘못 입력')
def changer(ee): ## 학생 정보 수정할때 파일 갱신할 함수
with open('db.txt','wb')as file:
for i in range(len(ee)):
p.dump(ee[i],file)
def deleteInfo(): ## 학생 정보 삭제 할 함수
stuNum=input('삭제할 학번을 입력하세요')
c=0
e=readStudent()
for i in range(len(e)):
if e[i].get('학번')==stuNum:
print(e[i])
data=e[i]
c=int(input('정말로 이정보를 삭제 하시겠습니까? 1. 예 2.아니오'))
if c==1:
with open('db.txt','wb')as file:
for i in range(len(e)):
if e[i]!=data:
p.dump(e[i],file)
elif c==0:
print('해당학번이 존재하지 않습니다')
elif c==2:
print('삭제를 취소하셧습니다')
while True: ## 메인으로 돌아갈 부분
num=int(input("1. 입력 2. 출력 3. 검색 4. 수정 5. 삭제 0. 종료"))
if num==1:
inputStudent()
elif num==2:
ScoreStudent()
elif num==3:
searchInfo()
elif num==4:
modifyInfo()
elif num==5:
deleteInfo()
elif num==0:
break
else:
print('잘못입력하셧습니다')
파이썬 파일 입출력 자바처럼 간단할 줄 알았는데 내가 좀 복잡하게 생각해서 그런지 엄청 오랜 시간이 걸렸다.. 파이썬 문법에 좀 익숙해져야 할 것 같다. 파이썬처럼 코드를 작성해야 하는데 아무리 봐도 자바처럼 작성하는 것 같다.. 얼른 버릇을 고쳐야 파이썬다운 코드를 작성할 수 있을 것 같다
그리고 아무리 봐도 비효율적인 코드인 거 같다. 코드를 보면 수정과 삭제를 하게 되면 정보를 어디에 잠시 저장해 놨다가
그 정보를 수정하면 파일을 새롭게 열어서 덮어쓰는 방식인데 이렇게 되면 나중에 엄청 많은 데이터가 있으면 효율이 엄청 떨어질 것 같다.. 그래서 파일을 연상태로 그 파일의 내용을 읽고 수정하고 삭제할 순 없을까 라는 생각으로 계속 시도 중에 있는 실패 중이다... 추후에 이 문제가 해결되면 수정본으로 올려야겠다..
찾아본 결과... 그런 방법은 존재하지 않다고 한다.. 내가 잘 못 찾는 거 일수도 있다.. 누군가 방법을 안다면 댓글로 알려주시면 감사하겠습니다....