python随机抽取人名_python实现艾宾浩斯背单词功能,实现自动提取单词、邮件发送,再也不用担心背单词啦...
已經(jīng)完成了利用python爬蟲(chóng)實(shí)現(xiàn)定時(shí)QQ郵箱推送英文文章,輔助學(xué)習(xí)英語(yǔ)的項(xiàng)目,索性就一口氣利用python多做一些自動(dòng)化輔助英語(yǔ)學(xué)習(xí)的項(xiàng)目,對(duì)自己的編程能力和英文水評(píng)也有一定的幫助,于是在兩天的努力下,我完成了今天的項(xiàng)目。
首先是艾賓浩斯記憶法,大家了解一下真的非常有效果(至少對(duì)于我來(lái)講啦┑( ̄Д  ̄)┍)
當(dāng)然,我也會(huì)把自己的項(xiàng)目上傳到github上供大家指正,由于本人非常喜歡python和英語(yǔ),所以后期也做很多將兩者結(jié)合起來(lái)的項(xiàng)目。所以,如果大家對(duì)本項(xiàng)目有興趣,希望體驗(yàn)或加入開(kāi)發(fā),又或者對(duì)它有一定的想法與意見(jiàn),歡迎加入我最近組建的交流群。謝謝大家啦~~
https://qm.qq.com/cgi-bin/qm/qr?k=yWHTRdPppmHE_YiNeTbTlCtqiD2qPm97&authKey=2tcLazZwqjqHuUpnrpJR2DalP/izfPw9xw7g6CQnZHYe9ZEoB4p0kbkgQ/aSa/nq (二維碼自動(dòng)識(shí)別)
本項(xiàng)目主要是通過(guò)在事先準(zhǔn)備好的excel單詞文件中每天抽取單詞,并反復(fù)使用QQ郵箱發(fā)送到自己的郵箱里提醒自己有一定規(guī)律的背單詞,項(xiàng)目最大的難點(diǎn)有三。
當(dāng)然,由于這個(gè)項(xiàng)目的文件還是比較多的,所以為了簡(jiǎn)化這個(gè)項(xiàng)目,我就先按照自己的開(kāi)發(fā)思路來(lái)說(shuō),當(dāng)然如果要自己來(lái)使用本項(xiàng)目還是要費(fèi)一番心思讀一讀代碼才好,因?yàn)樵赿ataframe數(shù)據(jù)的處理部分隨便拿一個(gè)小坑講一下都是一篇文章( )所以,各位一定要耐心讀下去鴨。
好了 show me the code
開(kāi)發(fā)環(huán)境 :python3.6 IDEA : pycharm2019 阿里云ECS: centos7
接下來(lái)我們看一下項(xiàng)目路徑,并注意對(duì)應(yīng)進(jìn)行解釋: (忽略我拙略的變量英文,就是因?yàn)檫@樣所以才好好學(xué)習(xí)英語(yǔ)鴨)
分別來(lái)解釋一下
data 目錄: 用于存放日志文件,分別有data_log.csv和word.csv data_log.csv 用于每天隨機(jī)抽取單詞的時(shí)候避免抽取到重復(fù)的單詞。 word.csv 是每天將每個(gè)單詞的time時(shí)間數(shù)據(jù)記錄進(jìn)去進(jìn)而用于計(jì)算單詞復(fù)習(xí)的時(shí)間。
*every_day_word* 目錄: 用于存儲(chǔ)每天隨機(jī)抽取的單詞機(jī)器詞義等相關(guān)信息,并將其存儲(chǔ)為csv格式,以對(duì)應(yīng)的時(shí)間為文件名存儲(chǔ),同步在上面的data_log.csv的time索引內(nèi)。
___ word 目錄 : 存儲(chǔ)總的單詞大表數(shù)據(jù)的目錄,很簡(jiǎn)單。
接下來(lái)就是我們的項(xiàng)目代碼部分,如你所見(jiàn)項(xiàng)目代碼都在項(xiàng)目的根目錄處,
接下來(lái)我會(huì)一 一的說(shuō)明這些代碼,當(dāng)然是以我自己的順序,對(duì)了代碼的詳細(xì)解釋在代碼的注釋里面,有任何疑問(wèn)和想法可以加入上面的群來(lái)交流。
word_read_project.py
這一部包含了多個(gè)函數(shù)與變量,是項(xiàng)目文件處理的第一核心部分,主要難點(diǎn)在于dataframe的控制問(wèn)題以及日志的讀寫(xiě)問(wèn)題,需要耐心的看完,推薦搭配pycharm專(zhuān)業(yè)版使用,非常方便。
#auther :keepython import pandas as pd import numpy as np import os import time import randomword_file_path = 'word/六級(jí)核心詞匯表(EXCEL表格).xls' data_log_path = 'data/data_log.csv' # data_log = pd.read_csv(data_log_path) words = pd.read_excel(word_file_path,header=0) # print(len(words)+1)#求出一共多少列,從1開(kāi)始算 # print(words.columns)#列索引名稱 # print(words.index)#行索引名稱words_index = words.index#函數(shù)功能:傳入隨機(jī)生成的單詞索引,返回單詞dataframe相關(guān)信息 def find_word(random_word_index,words):print(type(random_word_index))#根據(jù)隨機(jī)單詞的索引導(dǎo)出單詞的相關(guān)信息random_words = words.loc[list(random_word_index)]# print(random_words)return random_words#函數(shù)功能: 在進(jìn)行random_80函數(shù)操作以后對(duì)word.csv進(jìn)行同步記錄,注意傳進(jìn)來(lái)的必須是列表的形式 def word_csv_log(random_words,time_stamp):word_path = 'data/word.csv'word_log = pd.read_csv(word_path,index_col=0)#讀取單詞日志文件,同時(shí)將索引設(shè)置為對(duì)應(yīng)的時(shí)間for random_word in random_words:#將對(duì)應(yīng)的隨機(jī)抽取的單詞5min,30min,12hour分別標(biāo)記為1word_log.loc['time'][random_word] = time_stampword_log.iloc[0:3][random_word][0] = 1word_log.iloc[0:3][random_word][1] = 1word_log.iloc[0:3][random_word][2] = 1word_log.to_csv(word_path)print('標(biāo)記完成'.center(40,'='))#函數(shù)功能:讀取日志已經(jīng)選擇的單詞索引內(nèi)容返回列表 def data_log_read(data_log_path):data_logs = pd.read_csv(data_log_path)data_log_index = np.array(data_logs).tolist()return data_log_index#函數(shù)功能:通過(guò)索引提取dataframe中的行,返回對(duì)應(yīng)的dataframe數(shù)據(jù)方便生成csv文件 def random_80_word_to_csv(random_index,words):random_80_word_df = words.iloc[random_index,:]return random_80_word_df#函數(shù)功能:隨機(jī)從傳入的單詞索引列表中抽取80個(gè)詞 def random_80_word(words_indexs,words):data_log_path = 'data/data_log.csv'# print(type(words_index))#顯示傳入索引格式try:data_log_index = data_log_read(data_log_path)#返回日志中的索引words_index = [i for i in words_indexs if i not in data_log_index]except :words_index= list(words_indexs)random_word = random.sample(list(words_index),80)#同時(shí)記錄被選中的索引數(shù)據(jù)print(len(random_word))random_words = find_word(random_word,words)[['單詞']]random_words = np.array(random_words).tolist()#這里是列表嵌套的形式需要解套random_words = [i[0] for i in random_words]#將隨機(jī)抽取的#time模塊的使用還要考慮到后面everyday_word.csv文件命名的問(wèn)題,文件名稱中不能有特殊符號(hào)time_stamp = time.strftime("%Y-%m-%d-%H-%M", time.localtime())#使用time模塊以對(duì)應(yīng)的年-月-日-小時(shí)-分鐘的形式返回的數(shù)據(jù)為字符串every_day_word_path = 'every_day_word/'+str(time_stamp)+'.csv'random_80_word_df = random_80_word_to_csv(random_word,words)#在這一步調(diào)用函數(shù)同時(shí)生成對(duì)應(yīng)random文件數(shù)據(jù)word_csv_log(random_words,time_stamp)print(type(random_80_word_df))random_80_word_df.to_csv(every_day_word_path)data = {time_stamp: random_word}#用于data_log.csv路徑不存在情況if os.path.exists(data_log_path):#將今天生成的隨機(jī)單詞存入日志csv文件中備用datas = pd.read_csv(data_log_path)datas.loc[:, str(time_stamp)] = pd.Series(random_word)# datas[time_stamp] = random_word #注意,由于日期的原因無(wú)法輸入列索引相同的數(shù)據(jù),dataframe本質(zhì)有點(diǎn)像優(yōu)化的數(shù)據(jù)庫(kù)datas.to_csv(data_log_path,index=False)#注意這里的mode的設(shè)置,必須設(shè)置為覆蓋模式else:datas = pd.DataFrame(data)datas.to_csv(data_log_path, index=False)return random_word,every_day_word_path#將隨機(jī)索引的80個(gè)詞返回random_word_index,every_day_word_path = random_80_word(words_indexs=words_index,words= words) # print(random_word_index)random_words_df = find_word(random_word_index,words)#返回的依然是dataframe格式的數(shù)據(jù) # print(type(random_words))#返回索引到的單詞數(shù)據(jù)用于建立日期表 random_words = random_words_df[['單詞']]#對(duì)列進(jìn)行操作這里還是dataframe格式 random_words_lists = np.array(random_words).tolist()#注意這里的random_words_list每一個(gè)random_word都是單獨(dú)的列表,迭代時(shí)需要[0]for random_word in random_words_lists:print('今日隨機(jī)單詞'.center(80,'='))print(random_word[0]) #這里借助numpy將dataframe轉(zhuǎn)換為list格式方便后面進(jìn)行文件重組時(shí)間文件#word_read_pro.py的最終目的就是提供80個(gè)隨機(jī)單詞,不具備判斷能力,但是記錄隨機(jī)篩選的單詞的索引#在隨后的返回函數(shù)中根據(jù)csv時(shí)間文件判斷是否需要call_back # random_words_lists = np.array(random_words).tolist()#注意這里的random_words_list每一個(gè)random_word都是單獨(dú)的列表,迭代時(shí)需要[0]temp_word_write_pro.py
暫時(shí)文件讀寫(xiě)模塊 主要用于將word中的單詞數(shù)據(jù)轉(zhuǎn)化為data日志的方式,方便后面的存儲(chǔ)與數(shù)據(jù)處理。這一模塊需要單獨(dú)運(yùn)行,可以在部署服務(wù)器之前運(yùn)行一遍就好,當(dāng)然還是要注意centos7的絕對(duì)路徑的問(wèn)題。 show me the code
# auther : keepython import pandas as pd import numpy as np import random file_name = '六級(jí)核心詞匯表(EXCEL表格)' word_file_path = '/word_recording_project/word/' + file_name+'.xls' words = pd.read_excel(word_file_path,header=0) words_index = words.indexwords = words[['單詞']] print(len(np.array(words).tolist())) words = np.array(words).tolist()#將所有單詞轉(zhuǎn)換為列索引,行索引轉(zhuǎn)換為天數(shù) print(len(words)) datas = {} for word in words :datas[word[0]] = {"5min":0,"30min":0,'12hour':0,'day1':0,'day2':0,'day4':0,'day7':0,'day15':0,'time':'1111-11-11-11-11'}words_df = pd.DataFrame(data=datas) print(words_df) words_df.to_csv('/word_recording_project/data/word.csv') # print(words_df)every_day_count_pro.py
這一部分從標(biāo)題來(lái)看就是用于對(duì)every_day_word中的文件與data中的日志文件配合計(jì)時(shí)并返回對(duì)應(yīng)的文件路徑用于后面的郵件發(fā)送調(diào)用。
import time import datetime import pandas as pd import numpy as np from word_read_project import every_day_word_path from mail_send_project import mail_send_fuc#函數(shù)功能:負(fù)責(zé)time時(shí)間的相減,并分別返回時(shí)間間隔時(shí)間為1day 2day 4day 7day 15day 的路徑列表 def read_log_remind():word_log_path = '/word_recording_project/data/word.csv'word_log = pd.read_csv(word_log_path,index_col=0)word_log = word_log.Tword_log = word_log[word_log.time != '1111-11-11-11-11'] # 提取word.csv文件中time所有不等于‘1111-11-11-11-11’的模塊#將矩陣轉(zhuǎn)置方便使用index提取路徑time_stamp = time.strftime("%Y-%m-%d-%H-%M", time.localtime()).split('-')log_times = np.array(word_log['time']).tolist()today = datetime.datetime(int(time_stamp[0]),int(time_stamp[1]),int(time_stamp[2]),int(time_stamp[3]),int(time_stamp[4]))#分別設(shè)置對(duì)應(yīng)天數(shù)的路徑列表day_1_path = []day_2_path = []day_4_path = []day_7_path = []day_15_path = []for log_time in log_times:log_timed = log_time.split('-')# print(log_timed)last_day = datetime.datetime(int(log_timed[0]),int(log_timed[1]),int(log_timed[2]),int(log_timed[3]),int(log_timed[4]))reduce = today - last_day#用于判斷天數(shù)if reduce.days == 1:path = '/word_recording_project/every_day_word/'+log_time+'.csv'day_1_path.append(path)elif reduce.days == 2:path = '/word_recording_project/every_day_word/' + log_time+'.csv'day_2_path.append(path)elif reduce.days == 4:path = '/word_recording_project/every_day_word/' + log_time+'.csv'day_4_path.append(path)elif reduce.days == 7:path = '/word_recording_project/every_day_word/' + log_time+'.csv'day_7_path.append(path)elif reduce.days == 15:path = '/word_recording_project/every_day_word/' + log_time+'.csv'day_15_path.append(path)#列表收集完路徑后還需要去重day_1_path = list(set(day_1_path))day_2_path = list(set(day_2_path))day_4_path = list(set(day_4_path))day_7_path = list(set(day_7_path))day_15_path = list(set(day_15_path))return day_1_path,day_2_path,day_4_path,day_7_path,day_15_path#負(fù)責(zé)當(dāng)天的推進(jìn)5 min 30 min 12小時(shí) def today_word_count():today_path = every_day_word_pathprint('今日要推送的地址是: ',today_path)time_stamp = time.strftime("%Y-%m-%d", time.localtime())subject = '艾賓浩斯 '+time_stamp+' 第一次單詞提醒'mail_send_fuc(today_path,subject)time.sleep(300)#5min提醒mail_send_fuc(today_path,subject)time.sleep(1500)#30min提醒mail_send_fuc(today_path,subject)time.sleep(41400)#12小時(shí)提醒mail_send_fuc(today_path,subject)mail_send_project.py
郵件發(fā)送,輸入郵件主題和對(duì)應(yīng)的附件路徑直接發(fā)送,注意使用的時(shí)候修改一下對(duì)應(yīng)的一些變量。
import smtplib from email.header import Header from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from email.mime.application import MIMEApplication #從word.csv文件傳入文件everyday文件路徑就可以直接發(fā)送郵件 # everyday_file_path = '2020-02-02.csv'#函數(shù)功能:傳入附件路徑,郵件的主題發(fā)送郵件并返回發(fā)送狀態(tài)def mail_send_fuc(everyday_file_path,subject):message = MIMEMultipart()msg_from = '***********' # 發(fā)送方郵箱地址。password = '***************' # 發(fā)送方QQ郵箱授權(quán)碼,不是QQ郵箱密碼。msg_to = '*************'msg_to_1 = '******************' # 收件人郵箱地址。message = MIMEMultipart()message['From'] = msg_from # 發(fā)送者message['To'] = msg_to # 接收者# 郵件標(biāo)題message['Subject'] = Header(subject, 'utf-8')# 郵件正文內(nèi)容message.attach(MIMEText('艾賓浩斯根據(jù)你的遺忘曲線提醒單詞'.center(20,'+'), 'plain', 'utf-8'))#打開(kāi)文件part = MIMEApplication(open(everyday_file_path, 'rb').read())part.add_header('Content-Disposition', 'attachment', filename=everyday_file_path)message.attach(part)#添加文件try:client = smtplib.SMTP_SSL('smtp.qq.com', smtplib.SMTP_SSL_PORT)print("連接到郵件服務(wù)器成功")client.login(msg_from, password)print("登錄成功")client.sendmail(msg_from, msg_to, message.as_string())print("發(fā)送成功")except smtplib.SMTPException as e:print("發(fā)送郵件異常")finally:client.quit()# mail_send_fuc(everyday_file_path)main_code.py
調(diào)用所有模塊和函數(shù),將之組合起來(lái)實(shí)現(xiàn)最終的功能。項(xiàng)目在調(diào)用的時(shí)候也只需要調(diào)用main_dode.py就可以了。
import pandas as pd import numpy as np import os import time import random from every_day_count_pro import *#總的執(zhí)行函數(shù)包括寫(xiě)入word.csv日志的功能if __name__ == '__main__':day_1_paths, day_2_paths, day_4_paths, day_7_paths, day_15_paths = read_log_remind()today_word_count()time.sleep(3600)#1小時(shí)后再?gòu)?fù)習(xí)昨天的知識(shí)if len(day_1_paths) != False:for day_1_path in day_1_paths:subject = '1 天前的單詞復(fù)習(xí)'.center(20,'=')mail_send_fuc(day_1_path,subject)time.sleep(900)if len(day_2_paths) != False:for day_2_path in day_2_paths:subject = '2 天前的單詞復(fù)習(xí)'.center(20,'=')mail_send_fuc(day_2_path,subject)time.sleep(900)if len(day_4_paths) != False:for day_4_path in day_4_paths:subject = '4 天前的單詞復(fù)習(xí)'.center(20,'=')mail_send_fuc(day_4_path,subject)time.sleep(900)if len(day_7_paths) != False:for day_7_path in day_7_paths:subject = '4 天前的單詞復(fù)習(xí)'.center(20,'=')mail_send_fuc(day_7_path,subject)time.sleep(900)if len(day_15_paths) != False:for day_15_path in day_15_paths:subject = '15 天前的單詞復(fù)習(xí)'.center(20,'=')mail_send_fuc(day_15_path,subject)項(xiàng)目到這里就算開(kāi)發(fā)完成啦,注意這里面的dataframe數(shù)據(jù)的操作真的非常高效,但是坑也很多希望有需要的同學(xué)一定要認(rèn)真看。┑( ̄Д  ̄)┍
服務(wù)器定時(shí)任務(wù)部署
這一部分一定要修改好代碼里面對(duì)應(yīng)的路徑,還是那句話centos7里面的絕對(duì)路徑的問(wèn)題。
編輯crontab配置這一步詳細(xì)解釋可以看這里:
Linux-Centos 用crontab定時(shí)運(yùn)行python腳本詳細(xì)步驟
crontab -e編寫(xiě)配置文件
當(dāng)打開(kāi)配置文件的時(shí)候,我們可以看到類(lèi)似的配置代碼。每一行都代表一個(gè)定時(shí)任務(wù) , 我們要做的就是新添加一行配置代碼。
重啟服務(wù)
service crond restart最終就完成啦
歡迎留言交流學(xué)習(xí),有什么疑問(wèn)也可以交流,如果聊的開(kāi)心還可以多一個(gè)朋友。
總結(jié)
以上是生活随笔為你收集整理的python随机抽取人名_python实现艾宾浩斯背单词功能,实现自动提取单词、邮件发送,再也不用担心背单词啦...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: arm安卓模拟器(arm安卓)
- 下一篇: 安卓微信恢复大师是真的吗(安卓微信恢复大