최강 자격증 기출문제 전자문제집 CBT
전자문제집, CBT, 컴씨비티, 씨비티, 기사, 산업기사, 기능사, 컴활, 컴퓨터활용능력, 1급, 2급, 워드, 정보처리, 전기, 소방, 기계, 사무자동화, 정보기기, 제과, 제빵, 한국사, 공무원, 수능, 필기,
www.comcbt.com
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 |