Quantcast
Channel: 初心者タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 21499

#1 Python初学者が簡単な英単語学習ツールを作る

$
0
0

きっかけ

こんにちは。私は文系の大学生でプログラミングを独学で始めたのですが、何分ノリがわかりません。仕組みを理解していても、もっと効率的な方法を他の人達はしていたり、いわゆる一般的なプロジェクト開発というのを理解できていません。そういった意味で、批判上等で稚拙なプログラムを公開していきたいと思います。自分用の成長日記でもあります。いつか孫ができた暁には読ませます。そして英単語のプログラムを何故組んだのか、それは私の留学中の経験からでした。
留学中、字幕ありで映画を見ていたのですが、どうも会話においては使用する機械がなさそうであるけれど、知識として入れておきたい英単語が多くありました。それらを当初はノートに書いていたのですが分量が多く、時間がかかりました。現地の大学で授業を受けていたため、課題が多いのでわからない単語一気に打ち込んで見やすい状態でまとめてくれるプログラム組めば勉強捗るのでは??という言い訳で普段の勉強から離れPythonに手を出してしまったのでした。。。

概要

私はまず、Paizaで学習をしました。無料には弱いです。それで基礎を学び、とりあえず作ってみよう!という感じです。
流れとしましては、
単語入力→対応する英単語のページ表示→意味を抜き出す→吐き出す
を実現すれば良さそう。

実装

今回ご準備していただくのは
- web接続に必要なrequests
- webデータの処理に便利なBeautifulSoup
- 保存するファイル名に日付を導入したいのでdatetime
- csvファイルにして扱うのでcsv

qiita.py
importrequestsfrombs4importBeautifulSoupasbs4importdatetimeimportcsv

そして、わからない単語を入力したり、その単語の意味をリストに格納することにします。

qiita.py
unknown=[]result=[]path_w='\Unknown_words_'+str(datetime.date.today())+'.csv'#csvを処理する関数作成
defOpenCSV():withopen(path_w,mode='x')asnew:try:new.write('\n')new.close()exceptFileExistsError:withopen(path_w,mode='a')aswriteon:writeon.write()writeon.close()

入力した単語をunknownに入れ、抽出した意味をresultに入れます。ついでに保存先のパスも作っときます。
csvモジュールの扱いは本当に見様見真似です、あんまりわかってないです。openのmode='x'なら新規作成でもしすでに同名ファイルが存在していた場合の例外処理として、mode='a'も書いておきました。

OPEN関数のmodeですが詳しくはこちらを参考にしてください。

単語検索

本題の単語検索に入ります。今回は英語辞書としてWeblioを使います。理由としましては、開くURLが

qiita.py
'https://ejje.weblio.jp/content/'+わからない単語

という感じなので扱いやすかったからです。内容もわかりやすいですし一石二鳥。

qiita.py
#単語検索の関数を作る
defSearchWords(uw):try:line='https://ejje.weblio.jp/content/'+uwres=requests.get(line)res.encoding=res.apparent_encodingbs=bs4(res.content,'html.parser')globalmeaning_ameaning_a=bs.find(class_='content-explanation ej').textexceptAttributeError:#存在しない場合AttributeErrorを返すので例外処理を記入する
meaning_a='見つかりませんでした。'pass

引数にUnknownWordsの略でuwとおいています。特に特筆すべきところはないんですが、weblioでは意味は"content-explanation ej"というクラスに保存されていますので.textでテキスト形式にしましょう。
この際、スペルミスや存在しない英単語が引数に入っていますと、AttributeErrorを返しますので、そのときには見つからなかったことを記載しスキップするよう記述しています。

入力

whileTrue:wrd=input('Type your unknown words (If you submit Enter, it finishes.)\n')#このままだと入力されっぱなしで無限ループするので、breakするきっかけを作る
ifwrd=="":breakelse:unknown.append(wrd)

きれいな終わらせ方がわからなかったのでから送信されるとそこでunknownリスト格納を中断するようにしています。

メインの処理

#入力後、格納されたリストから一つずつ関数にはめ、辞書を作成
foriinrange(len(unknown)):result_tmp=[]obj=unknown[i]result_tmp.append(obj)SearchWords(obj)result_tmp.append(meaning_a)print(result_tmp)result.append(result_tmp)

とりあえず一時的にresult_tmpというリストに[単語,意味]をぶち込みます。その後二次元リスト(というのですか?無学なもので・・・)の形で入れます。

csv

withopen(path_w,'a')ascsv_w:writer=csv.writer(csv_w)writer.writerows(result)

csvに落とし込んで終わりです。
CSVファイルはエクセルで読み込めるので最低限はコレでいいかなという感じです。

Pandasってやつ使ってExcelをもっとキレイにしたいですね~~。
最後に汚いコードを載せますので、改善点等あれば参考にさせていただきますので、ぜひぜひコメントの方お願いします!

importrequestsfrombs4importBeautifulSoupasbs4importdatetimeimportcsv# import pandas as pd
#格納する場所を作成する。
unknown=[]result=[]path_w='保存したい場所/Unknown_words_'+str(datetime.date.today())+'.csv'defOpenCSV():withopen(path_w,mode='x')asnew:try:new.write('\n')new.close()exceptFileExistsError:withopen(path_w,mode='a')aswriteon:writeon.write()writeon.close()#単語検索の関数を作る
defSearchWords(uw):try:line='https://ejje.weblio.jp/content/'+uwres=requests.get(line)res.encoding=res.apparent_encodingbs=bs4(res.content,'html.parser')globalmeaning_ameaning_a=bs.find(class_='content-explanation ej').textexceptAttributeError:#存在しない場合AttributeErrorを返すので例外処理を記入する
meaning_a='見つかりませんでした。'pass#入力させる
whileTrue:wrd=input('Type your unknown words (If you submit Enter, it finishes.)\n')#このままだと入力されっぱなしで無限ループするので、breakするきっかけを作る
ifwrd=="":breakelse:unknown.append(wrd)#入力後、格納されたリストから一つずつ関数にはめ、辞書を作成
foriinrange(len(unknown)):result_tmp=[]obj=unknown[i]result_tmp.append(obj)SearchWords(obj)result_tmp.append(meaning_a)print(result_tmp)result.append(result_tmp)#csvファイルに変換し、Excel等で使えるようにする
withopen(path_w,'a')ascsv_w:writer=csv.writer(csv_w)writer.writerows(result)

駄文、読んでいただいてありがとうございました!これからも頑張りたいと思います。


Viewing all articles
Browse latest Browse all 21499

Latest Images

Trending Articles