프로그램/Python Project

[Python] comcbt 중복문제 제거하기

 

최강 자격증 기출문제 전자문제집 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 해야한다.