정구리의 우주정복
Python Project 01. 단어장 만들기 (6) - 제작완료 (소스코드 및 후기) 본문
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 ,틀리면 단어를 틀린단어 리스트에 저장을 해준다 -> 문제를 다 풀면 맞은 개수 , 틀린 단어를 출력
결과물
내가 보고 있던 페이지의 단어시험을 본다 (3페이지) 시험을 다 보면 점수와 틀린 단어를 출력해준다
종료를 하게되면 while 문을 빠져나와 종료하게 된다
프로젝트 후기
나의 첫번째 파이썬 프로젝트를 마쳤다 ! 부족한게 많은 프로그램이지만 그래도 내가 원하던 기능들은 모두 구현을 해서 만족스럽다
소스코드가 많이 지저분한데 좀 더 만들다보면 더 간결하고 ,깔끔하게 짤 수 있지 않을까 생각을 한다.
최근에 크롤링을 공부하고 있어서 이걸 이용하며 파이썬의 라이브러리를 사용할 수 있는 프로젝트가 뭐가 있을까 하다가 단어장을 만들어 보게 되었는데 openpyxl 과 re 등 몇가지 새로운 라이브러리를 사용하며 만들어 보는게 아주 재미있었다
살짝 아쉬운건 윈도우 창을 열어서 구현을 해 보고싶었는데 그 부분은 또 조금 공부를 하고 만들어보는걸로 :-)
실행파일은 또 만드는 방법이 따로 있길래 공부해서 만들 예정이다 (곧)
첫번째 프로젝트라 더 의미있는 단어장이다
앞으로 더 화이팅