2023. 3. 10. 18:50ㆍ개발/파이썬
Jupyter notebook 을 사용하였습니다.
다른 툴을 사용하실 분은 다른 것을 쓰셔도 됩니다.
준비물) 성적증명서(있으면 편함)
1) 성적 텍스트 파일 만들기
성적 증명서 PDF 파일을 "크롬"으로 엽니다.
성적 부분을 복사해서 메모장에 붙입니다.
각 학기와 과목들이 한 줄 한 줄 입력될 것입니다.
이 때 이수 과목의 순서는
과목유형, 취득학점, 성적, 과목명
입니다.
과목명이 길어 2줄로 분리된 경우 꼭 한 줄로 만들어 주시기 바랍니다.
2) 성적 텍스트 파일 가공하기
my = open("./newfile.txt", "w") # 이 코드 파일을 실행했을 때 새롭게 생길 txt 파일. 미리 생성해두지 않아도 된다.
grade = ["A", "B", "C", "D"] # 성적 리스트
pf = ["P", "F"] # p/f 과목 전용
year = ["2017", "2018", "2019", "2020", "2021", "2022"] # 학교를 다녔던 연도
notUse = ["총취득", "총평점", "환산점", "평점:", "신청학", "[20"] # 이 단어가 포함되는 줄은 텍스트 파일에 추가하지 않음
# 기존 성적증명서에서 복붙한 텍스트 파일을 읽기모드로 연다.
with open("raw_grade.txt", "r", encoding = "utf-8") as f:
curyear = "" # 수강연도
cursem = "" # 학기
for line in f: # 파일에서 맨 위부터 한줄씩 불러옴
line = line.replace(' ', '') # 줄 내 띄어쓰기 모두 제거
gradeChk = False # 등급은 +가 달린 것과 안달린 것을 각각 검사하기에 상태 체크용 변수를 선언.
for i in year: # 연도 리스트 순환문
if(i in line): # 줄안에 연도가 있으면
curyear = i # 이수 연도에 저장
cursem = line[8] # 이수 학기에 저장
# 전공과 교양 그리고 일반 과목의 구분이 이런식으로 된다. 학교에 따라 다를 수 있으니 바꾸도록 하자.
# 과목유형 띄어쓰기를 위한 검사
if("1전선" in line or "1전심" in line):
if("1전선S" in line):
line = line.replace(line[0:4] , line[0:3] + " ") # 4글자를 3글자 + 공백으로 변환
else:
line = line.replace(line[0:3] , line[0:3] + " ") # 3글자를 3글자 + 공백으로 변환
elif("교필" in line or "교선" in line or "일선" in line): # 2글자를 2글자 + 공백으로 변환
line = line.replace(line[0:2] , line[0:2] + " ")
# 취득학점 뒤에 .0 이 붙는데 이건 필요가 없으니 지운 뒤에 한칸 띄운다.
if(".0" in line):
line = line.replace(".0" , " ")
# 성적 띄우기
if("+" in line):
line = line.replace("+" , "+ ") # + 가 붙는 성적은 + 뒤로 한칸 띄운다.
gradeChk = True # 여기서 성적을 체크했으므로 true
for i in grade: # + 가 붙지 않는 성적들을 검사
if(i in line and not gradeChk):
line = line.replace(i, i + " ")
gradeChk = True
# p/f 성적 띄우기. 삼성은 p/f를 각각 PASS,FAIL로 입력해야 인식한다. 미리 바꿔두고 한칸 띄운다.
for i in pf:
if(i in line and line[line.index(i) - 1] == " "):
if(i == "P"):
line = line.replace(i, "PASS ")
else:
line = line.replace(i, "FAIL ")
# 뒤에 연도와 학기를 붙여주는 작업
if(curyear not in line):
line = line.strip() + " " + curyear + " " + cursem + '\n'
# 쓸모없는 줄은 파일에 입력하지 않는다.
if(line[0: 3] not in notUse):
my.write(line)
print(line)
my.close()
주피터 노트북 python3 파일을 새로 만들고 붙여넣어 실행합니다.
학교마다 성적증명서 양식이 다를 수 있으니 위의 코드에 적어둔 설명을 읽어주세요.
이 코드를 실행하면 코드 파일과 동일한 폴더에 newfile.txt 파일이 생깁니다.
newfile.txt의 입력 순서는
과목유형, 취득학점, 성적, 과목명, 수강연도, 학기
입니다.
3) 액셀 파일로 완성하기
newfile.txt 와 삼성 지원서 페이지에서 받은 학점 이수표 엑셀파일을 활용해 엑셀 파일로 완성할 것입니다.
주피터 노트북 아래 새로운 칸을 만들어 다음과 같이 입력한 뒤 실행합니다.
!pip3 install openpyxl
엑셀 파일을 수정할 수 있는 패키지를 설치하는 명령어입니다.
from openpyxl import load_workbook # 액셀 읽는 패키지 설치
wb = load_workbook("./이수교과목_20230309163843.xlsx") # 읽는다.
ws = wb.active # 워크시트의 객체를 만든다. -> 기본값은 첫번째 시트가 대상. 삼성의 성적이수표 액셀파일의 첫번째 시트가 성적이수표이다.
test = [] # 중간에 값을 볼 수 있도록 테스트용 리스트를 선언
# 액셀은 0부터가 아닌 1부터 시작이다.
for i in range(1, ws.max_row + 1): # 시트의 첫번째 행 ~ 마지막 행
for j in range(1, ws.max_column + 1): # 시트의 첫번째 열 ~ 마지막 열
test.append(ws.cell(row=i, column = j).value) # 테스트 리스트에 액셀의 행의 값을 차례로 넣어본다.
#print(test)
fi = open("newfile.txt", "r") # 가공을 마친 텍스트 파일을 읽기전용으로 연다.
gradeList = [] # 이수 정보를 담을 리스트
for i in fi:
gradeList.append(list(i.strip().split(' '))) # 리스트에 한줄씩 삽입한다. 이 때 공백으로 분리한다.
# grade list의 한 행 안의 구성요소
# 과목유형, 취득학점, 성적, 과목명, 수강연도, 학기
print(gradeList)
fi.close() # 텍스트 파일의 이용이 끝났으니 닫아준다.
test = [] # 테스트 리스트 초기화
# 액셀의 구성요소
# NO, 전공명, 수강연도, 학기, 과목명, 과목유형, 취득학점, 성적, 재수강여부
for i in range(len(gradeList)):
ws.cell(row = i + 2, column = 1, value = i + 1) # 액셀의 첫번째 필드 NO -> 인덱스 i 값에 1 더해서 넣어주면 된다.
ws.cell(row = i + 2, column = 2, value = "[기타]OO학과(OO대-학사-주전공)") # 전공명은 다음과 같은 양식으로 입력
ws.cell(row = i + 2, column = 3, value = int(gradeList[i][4])) # 수강연도, 숫자(int)로 바꿔서 기입해준다.
if(gradeList[i][5] != "동" and gradeList[i][5] != "하"):
ws.cell(row = i + 2, column = 4, value = int(gradeList[i][5])) # 동계나 하계가 아니면 1,2 학기이므로 숫자로 변환해서 입력
else:
if(gradeList[i][5] == "동"): # 동계일 경우 "겨울계절" 로 기입. 이렇게 해야 홈페이지에 업로드 했을 때 인식한다.
ws.cell(row = i + 2, column = 4, value = "겨울계절")
elif(gradeList[i][5] == "하"): # 하계일 경우 마찬가지
ws.cell(row = i + 2, column = 4, value = "여름계절")
# 과목 유형 분류한다. 앞에 1이 붙어서 1이 붙으면 전공으로 처리하였다. (예: 1전선, 1전심)
# 학교마다 유형이 다르므로 텍스트 파일을 가공할 때 미리 처리하거나 여기서 값을 수정하자.
# 값은 "전공" / "교양기타" 로 해야 자동 인식이 된다.
if(gradeList[i][0][:1] == "1"):
ws.cell(row = i + 2, column = 6, value = "전공")
else:
ws.cell(row = i + 2, column = 6, value = "교양기타")
# 취득학점과 성적을 입력한다. 숫자가 들어가야할 칸은 항상 int로 감싸서 숫자로 변환해준다.
ws.cell(row = i + 2, column = 7, value = int(gradeList[i][1][:1]))
ws.cell(row = i + 2, column = 8, value = gradeList[i][2])
# 우리 학교는 재수강을 했을 경우, 과목명 앞에 대문자 R을 붙인다.
# 각자 방식에 따라 수정해주자.
# 재수강 여부 입력이다. 과목명 앞 1자리가 "R" 이면 "Y" 를 입력, 아니면 "N" 을 입력한다.
if(gradeList[i][3][0] == "R"):
ws.cell(row = i + 2, column = 5, value = gradeList[i][3][1:])
ws.cell(row = i + 2, column = 9, value = "Y")
else:
ws.cell(row = i + 2, column = 5, value = gradeList[i][3])
ws.cell(row = i + 2, column = 9, value = "N")
#올바로 입력했는지 테스트 리스트에 액셀 값을 넣어 테스트
for i in range(1, ws.max_row + 1):
for j in range(1, ws.max_column + 1):
test.append(ws.cell(row=i, column = j).value)
#print(test)
# 이수교과목.xlsx 라는 액셀파일을 새로이 만들어 여기 저장한다. 자동으로 만들어지니 미리 만들 필요가 없다.
wb.save('./이수교과목.xlsx')
그 다음, 아래 또 하나의 블럭을 추가하여 다음과 같이 입력합니다.
실행전에 코드 주변의 코멘트를 읽어보시고 포맷에 맞게 수정해주시기 바랍니다.
실행하면 "이수교과목.xlsx" 라는 새로운 엑셀 파일이 같은 폴더 내에 생깁니다.
열어보시면 완성된 이수교과목 엑셀을 확인하실 수 있습니다.
궁금하신 점은 댓글 달아주시면 상세히 알려드리겠습니다.