PC정비사 공부를 하면서 COMCBT 사이트에서 도움을 받고 있다. 우리나라 자격증의 특징인데, 문제은행식이어서 중복되는 문제들이 너무 많았다. 이를 제거해서 자주출제되었던 것들만 공부할 수 있으면 효율적이지 않을까 하는 생각에 코드를 만들었다. 코드는 다음과 같다.
import os
from PyPDF2 import PdfReader
location = ### 저장소 위치, 있는 폴더로 저장하세요 ###"
def extract(i) :
reader = PdfReader(i)
pages = len(reader.pages)
text = ""
for i in range(pages) :
text += reader.pages[i].extract_text()
return text
def duplicate_checker(l,cand) :
if(cand[0] in l and cand[1] in l and cand[2] in l) :
return True
if(cand[0] in l and cand[2] in l and cand[3] in l) :
return True
if(cand[0] in l and cand[3] in l ) :
return True
if(cand[1] in l and cand[2] in l ) :
return True
if(cand[1] in l and cand[3] in l ) :
return True
if(cand[2] in l and cand[3] in l ) :
return True
return False
def file_write(i,text) :
with open(str(i)+".txt","wt",encoding="UTF-8") as f:
f.write(text)
if __name__=="__main__" :
os.chdir(location)
try :
os.mkdir(r".\OUTPUT")
os.mkdir(r".\RAW")
except Exception as e:
pass
RAW_PDF_LIST = os.listdir(r".\RAW")
## Extract Code ##
dict_dat = dict()
count = 0
for i in RAW_PDF_LIST :
dict_dat[i] = extract(".\\RAW\\"+i)
file_write(".\\OUTPUT\\"+str(count),dict_dat[i])
count+=1
print(i," done")
## Dict Generate Code
PARSE_PDF_LIST = os.listdir(r".\OUTPUT")
STAT_Q = 0
STAT_A = 1
STAT_B = 2
STAT_C = 3
STAT_D = 4
cand_id_list = ["①","②","③","④"]
ans_id_list = ["❶","❷","❸","❹"]
qs = dict()
total_count = 0
for txt in PARSE_PDF_LIST :
data = list()
with open(".\\OUTPUT\\"+txt,"rt",encoding="UTF-8") as f :
lines = f.read().split("\n")
q_count = 0
question = ""
cand = ["","","",""]
answer = 0
cur_state = -1
for l in lines :
write_flag=False
if(l.strip() == "") :
continue
if(str(q_count+1)+". " in l) :
if(question != "") :
if(question not in qs) :
qs[question] = dict()
qs[question]["cand"] = cand
qs[question]["answer"] = answer
if("count" in qs[question]) :
qs[question]["count"] += 1
else :
qs[question]["count"] = 1
question = ""
cand = ["","","",""]
answer = 0
total_count +=1
question = l.split(str(q_count+1)+". ")[1].strip()
cur_state = STAT_Q
write_flag = True
if(cand_id_list[0] in l) :
cand[0] = l.split(cand_id_list[0])[1].split(cand_id_list[1])[0]
cand[0] = cand[0].split(ans_id_list[1])[0]
cur_state = STAT_A
write_flag = True
elif(ans_id_list[0] in l) :
cand[0] = l.split(ans_id_list[0])[1].split(cand_id_list[1])[0]
answer = 1
cur_state = STAT_A
write_flag = True
if(cand_id_list[1] in l) :
cand[1] = l.split(cand_id_list[1])[1].split(cand_id_list[2])[0]
cand[1] = cand[1].split(ans_id_list[2])[0]
cur_state = STAT_B
write_flag = True
elif(ans_id_list[1] in l) :
cand[1] = l.split(ans_id_list[1])[1].split(cand_id_list[2])[0]
answer = 2
cur_state = STAT_B
write_flag = True
if(cand_id_list[2] in l) :
cand[2] = l.split(cand_id_list[2])[1].split(cand_id_list[3])[0]
cand[2] = cand[2].split(ans_id_list[3])[0]
cur_state = STAT_C
write_flag = True
elif(ans_id_list[2] in l) :
cand[2] = l.split(ans_id_list[2])[1].split(cand_id_list[3])[0]
answer = 3
cur_state = STAT_C
write_flag = True
if(cand_id_list[3] in l) :
cand[3] = l.split(cand_id_list[3])[1]
cur_state = STAT_D
write_flag = True
q_count+=1
elif(ans_id_list[3] in l) :
cand[3] = l.split(ans_id_list[3])[1]
answer = 4
cur_state = STAT_D
write_flag = True
q_count+=1
if(write_flag==False) :
if(cur_state==STAT_Q) :
question+= l
elif(cur_state==STAT_A) :
cand[0] += l
elif(cur_state==STAT_B) :
cand[1] += l
elif(cur_state==STAT_C) :
cand[2] += l
elif(cur_state==STAT_D) :
cand[3] += l
qs_sorted = sorted(qs.items(),key = lambda x:x[1]["count"],reverse=True)
with open("OUTPUT.txt","wt",encoding="utf-8") as f:
f.write("#### TARGET FILE ####\n")
for l in RAW_PDF_LIST :
f.write(l+"\n")
f.write("\n")
f.write("Total Question : "+str(total_count)+"\n\n")
f.write("Trimmed Question : "+str(len(qs_sorted))+"\n\n")
f.write("\n")
f.write("### EXAM LINE ###\n")
for v in qs_sorted :
f.write("Question : "+v[0]+" ## Count : "+str(v[1]["count"])+"\n\n")
f.write("1. "+v[1]["cand"][0]+"\n")
f.write("2. "+v[1]["cand"][1]+"\n")
f.write("3. "+v[1]["cand"][2]+"\n")
f.write("4. "+v[1]["cand"][3]+"\n\n")
f.write("Answer : "+str(v[1]["answer"]))
f.write("\n\n\n")
print("PARSE FINISH")
조금 비효율적인 조건문이 있으나, 알바없다.... 사용방법은 폴더아래 RAW라는 폴더를 만들고, 그 안에 comcbt.com에서 다운로드 받은 교사용.pdf를 넣어두고 코드를 실행하면 끝이다. 중복된 문제들을 제외하고, 나왔던 빈도수의 내림차순으로 output.txt가 생성된다.
* 참고사항
1. 텍스트만 추출했기 때문에, 그림문제는 정상적으로 안보인다.
2. 이유는 모르겠는데, 번호를 구분하는 ① 이런게 한줄에 엄청 많으면 그 파일을 불러오는데 실패한다. 필요하면 나중에 고치지 뭐;
3. PyPDF2는 pip3로 install 해야한다.
'프로그램 > Python Project' 카테고리의 다른 글
[Python Project] 비트코인 자동거래 -시현- (24) | 2021.07.04 |
---|---|
[Python Project] 비트코인 자동거래 -로컬파일핸들러- (4) | 2021.06.28 |
[Python Project] 비트코인 자동거래 -사전준비- (6) | 2021.06.28 |
[Python Project] 이상형 월드컵 나만의 UI만들기 -시현- (1) | 2021.06.27 |
[Python Project] 이상형 월드컵 나만의 UI만들기 - 기능도- (0) | 2021.06.27 |