정구리의 우주정복

Python Project 01. 단어장 만들기 (6) - 제작완료 (소스코드 및 후기) 본문

PYTHON/PROJECT

Python Project 01. 단어장 만들기 (6) - 제작완료 (소스코드 및 후기)

Jungry_ 2020. 4. 6. 23:56
반응형

2020.4.3 - 2020.4.6 프로젝트01 단어장 만들기 완료 

 

전체 소스는 getWord.py (단어장 엑셀파일 만드는 부분) , openWord.py (실질적 기능을 수행하는 부분) , wordTest.py (단어시험) 이렇게 파일 3개다 openWord.py 에 나머지 두 파일을 import 해서 사용해 줬다 . 


getWord.py

# 단어장 불러와서 엑셀에 자동저장하기 
import ssl
import re
from urllib.request import urlopen
from bs4 import BeautifulSoup
from openpyxl import Workbook

def getWord():
    context = ssl._create_unverified_context()  

    #url 선택부분
    print('''원하는 단어장을 선택하세요\n 1. 중등\n 2. 고등\n 3. 토익''')
    selectLevel = int(input("번호 입력 : "))    
    print("단어장 만드는중 뚝딱 뚝딱")
    
    if selectLevel == 1:
        url = 'https://learn.dict.naver.com/m/endic/wordbook/mhs/100001/200001/words.nhn?filterType=0&orderType=2&pageNo='
    elif selectLevel ==2 :
        url = 'https://learn.dict.naver.com/m/endic/wordbook/mhs/100004/300059/words.nhn?filterType=0&orderType=2&pageNo='
    elif selectLevel ==3 :
        url = 'https://learn.dict.naver.com/m/endic/wordbook/exam/10001/20001/words.nhn?filterType=0&orderType=2&pageNo='
    else :
        print("default")

    #단어 불러오기  

    page = 1    

    #openpyxl 부분
    wb = Workbook()
    ws1 = wb.active #활성 시트를 만들어준다
    ws1.title='wordList'
    n=1 

     #re 부분
    pattern = re.compile(r'\s+')    


    for i in range(5) :
        newUrl = url+str(page)  

        html = urlopen(newUrl,context=context).read()
        soup=BeautifulSoup(html,'html.parser')
        wordClass=soup.find_all(class_='lst_li2')
        for i in wordClass : 
            word = i.select_one('.words').text #단어정보
            mean = i.select_one('.txt_ct2').text
            splitMean=(mean.split(','))[0]  

            splitMean=re.sub(pattern,'',splitMean)

            wordList =[word,splitMean]

            for i in range(n,n+1): #1부터 2까지 (2개를 넣어줄거라서)
                ws1.cell(row=i,column=1).value=wordList[0] #앞에 단어를 넣어줌
                ws1.cell(row=i,column=2).value=wordList[1]
                n=n+1   

        page = page+1
    wb.save('./wordList.xlsx')

네이버 단어장을 크롤링 해서 엑셀로 만들어 주는 작업 openpyxl 의 workbook 기능을 이용해 불러온 것을 엑셀에 저장해 주었다 


openWord.py

#단어 읽어들여서 20개씩 끊어서 출력해주기
# 이전 , 다음 기능 도 생각해보기 

from openpyxl import load_workbook
import wordTest
import getWord

getWord.getWord()
#data_only = True 를 해야지 값으로 가져옴 (안그러면 수식)
load_wb = load_workbook('./wordList.xlsx',data_only=True)
load_ws = load_wb['wordList'] #시트이름 

words = [] #단어가 들어갈 리스트
mean = [] # 뜻이 들어갈 리스트

eng = load_ws['A'] #A,B.. : 열을 가져옴
kor = load_ws['B'] #1,2,... : 행을 가져옴
#word와 mean 에 넣은 상태
for cell in eng:
    
    words.append(cell.value)
for cell in kor:
    mean.append(cell.value)


page = 0
end = len(words) #

div = 20 #20개씩 끊어서 출력해줌
#20개씩 각 리스트에저장
wordResult = [words[i*div:(i+1)*div] for i in range((end+div-1)//div)]
meanResult = [mean[i*div:(i+1)*div] for i in range((end+div-1)//div)]

n=0
print('page '+str(page+1)+'/'+str(len(wordResult)))
for i in wordResult[page]:
    print(str(n+1)+'. '+i+"  "+meanResult[0][n])
    n=n+1
n=0

while True:
    print('\n(1) 이전 (2) 다음 (3) 원하는 페이지 이동 (4) 현재 단어 시험보기 (5) 단어장 종료\n')
    selectMenu = int(input("메뉴입력 : "))

    if selectMenu== 1:
        if page ==0 :
           print("\n첫번째 페이지 입니다\n")
        else:
            page = page-1
            print('page '+str(page+1)+'/'+str(len(wordResult)))
            for i in wordResult[page]:
                print(str(n+1)+'. '+i+"  "+meanResult[int(page)][n])
                n=n+1
            n=0
    elif selectMenu== 2:
        if page ==(len(wordResult))-1: 
            print("\n맨 마지막 장입니다\n")
        else:
            page = page+1
            print('page '+str(page+1)+'/'+str(len(wordResult)))
            for i in wordResult[page]:
                print(str(n+1)+'. '+i+"  "+meanResult[int(page)][n])
                n=n+1
            n=0
    elif selectMenu == 3 :
        pageNum=int(input("원하는 페이지 입력 = "))
        if pageNum > len(wordResult) or pageNum-1 < 0 :
            print("잘못 입력하셨습니다")
        else:
            page = pageNum-1 #실질적으론 입력받은거에서 하나 빼줘야한다
            print('page '+str(page+1)+'/'+str(len(wordResult)))
            for i in wordResult[page]:
                print(str(n+1)+'. '+i+"  "+meanResult[int(page)][n])
                n=n+1
            n=0
    elif selectMenu == 4 :
        wordTest.getWord(wordResult[page],meanResult[page])
        print('page '+str(page+1)+'/'+str(len(wordResult)))
        for i in wordResult[page]:
            print(str(n+1)+'. '+i+"  "+meanResult[int(page)][n])
            n=n+1
        n=0
    elif selectMenu == 5 :
        break

 

우선 openpyxl 의 load_workbook 을 이용해 만든 단어장을 불러와 그것을 리스트에 저장을 하고  리스트를 또 20개로 나눠서 새로운 리스트에 저장을 해 2중 리스트를 만들어 그걸 다뤄서 구현했다 . 

 

구현된 기능은 

1. 실행시 단어 20 개 출력

2. 이전(이전 단어 20 개 출력)

3. 다음 ( 다음 단어 20개 출력)

4. 원하는 페이지로 이동 

5. 단어시험 

6. 종료

 

 


wordTest.py

#단어를 불러오는 부분 
import random
#딕셔너리 값 삽입은 그냥 이름[키] = 값
def getWord(wordResult,meanResult):
    
    wordList = [] #단어들이 들어갈 목록
    # print(len(wordResult[int(page)]))
    n=0
    for i in wordResult:
        word=[]
        word.append(wordResult[n])
        word.append(meanResult[n])
        wordList.append(word)
        
        n=n+1
    random.shuffle(wordList) #wordList 의 배열을 무작위로 해준다
    print("\n 단 어 시 험 뿌 슝 빠 슝 \n")
    score = 0
    wrongWord = [] #틀린단어 저장용
    for i in range(len(wordList)):
        print(str(i+1)+'.'+wordList[i][1])
        insertWord = input("단어 입력")
        if insertWord == wordList[i][0]:
            print("정답")
            score = score+1
        elif insertWord != wordList[i][0]:
            print("땡 정답은 "+wordList[i][0]+" 입니다")
            wrongWord.append(wordList[i])
    print("맞은 개수 : "+str(score))
    
    print("*****틀린 단어*****")
    for i in range(len(wrongWord)) :
        print("단어 : "+wrongWord[i][0]+" 뜻 : "+wrongWord[i][1])
    print("*****************")
    getBack = input("돌아가려면 엔터를 눌러주세요")

단어시험 부분

openWord.py 에서 현재 페이지의 단어를 가져와 [단어,뜻] 이 들어있는 새로운 리스트에 저장을 해준다 

뜻 부분을 가져오고 -> 입력을 받는다 -> 입력값이 단어와 같으면 점수 +1 ,틀리면 단어를 틀린단어 리스트에 저장을 해준다 -> 문제를 다 풀면 맞은 개수 , 틀린 단어를 출력 

 

 


결과물 

첫 실행 화면 ( 단어장 선택 및 단어 목록중 20개 출력)
다음 과 이전 기능 구현 
원하는 페이지로 이동
단어시험

내가 보고 있던 페이지의 단어시험을 본다 (3페이지) 시험을 다 보면 점수와 틀린 단어를 출력해준다

프로그램 종료

종료를 하게되면 while 문을 빠져나와 종료하게 된다 

 


프로젝트 후기 

 

나의 첫번째 파이썬 프로젝트를 마쳤다 ! 부족한게 많은 프로그램이지만 그래도 내가 원하던 기능들은 모두 구현을 해서 만족스럽다 

소스코드가 많이 지저분한데 좀 더 만들다보면 더 간결하고 ,깔끔하게 짤 수 있지 않을까 생각을 한다.

최근에 크롤링을 공부하고 있어서 이걸 이용하며 파이썬의 라이브러리를 사용할 수 있는 프로젝트가 뭐가 있을까 하다가 단어장을 만들어 보게 되었는데 openpyxl 과 re 등 몇가지 새로운 라이브러리를 사용하며 만들어 보는게 아주 재미있었다 

 

살짝 아쉬운건 윈도우 창을 열어서 구현을 해 보고싶었는데 그 부분은 또 조금 공부를 하고 만들어보는걸로 :-)

실행파일은 또 만드는 방법이 따로 있길래 공부해서 만들 예정이다 (곧)

 

첫번째 프로젝트라 더 의미있는 단어장이다 

앞으로 더 화이팅

 

반응형
Comments