用python实现背单词的小脚本系统

python

前提准备

  1. 安装好python及其环境
  2. 安装好Oracle数据库
  3. python中安装好cx_Oracle包,且能与数据库正常联立交互

注: 前提准备部分的内容不做描述,百度均有教程

步骤:

第一步:在oracle中创建以下表:

下面展示 建表语句

--ID_FLAG表是用以记录单词进度
create table ID_FLAG
(id_value    NUMBER(5),insert_time VARCHAR2(50)
)-- EXAM_FUN2表用以记录模块2中测验的结果
create table EXAM_FUN2
(id            NUMBER(5),word          VARCHAR2(100),chinese_value VARCHAR2(1024),insert_time   VARCHAR2(50),isright       VARCHAR2(10)
)-- ALL_WORDS表是单词的记录储存表
create table ALL_WORDS
(id            NUMBER(5) not null,word          VARCHAR2(100),chinese_value VARCHAR2(1024)
)--
-- 这是用以储存自已写的例句表
create table EXAMPLE_SENTENCE_TABLE
(id_scope         VARCHAR2(10),example_sentence VARCHAR2(500),insert_time      VARCHAR2(50)
)
第二步:运行脚本向数据库中导入文件里的单词数据

下面这个是单词的txt文件:
链接: https://pan.baidu.com/s/1Ga2sHQJrpg3LGvLDt_i4vQ?pwd=1234

这是导入数据库的脚本代码:
:代码中的数据库账号密码端口以及文件路径等信息需要自行修改。

import cx_Oracle as cxdef condba():global connusername = 'briup'  #数据库的账号        password = 'briup'  #数据库的密码     host = '127.0.0.1:1521/XE' conn = cx.connect(username,password,host)cursor = conn.cursor()return cursordef run(con):'''准备写一个方法可以读取指定文件夹中的文件,并将文件名和指定数放在两个list中'''#============拆分文件模块开始==============#print('=======进入run方法========')#print(content)list_id=[]list_word=[]list_chineseValue=''strlist = con.split()#print(strlist)list_id = strlist[0]list_word = strlist[1]list_len = len(strlist)#print(list_len)if list_len == 3:list_chineseValue = strlist[2]else:i = 2temp_str=''while i < list_len:temp_str = temp_str+str(strlist[i])i = i+1#print(temp_str)list_chineseValue=temp_str#print('==========拆分结束=========')# #========已将文件拆到三个列表中========# #============拆分文件模块结束==============   return   list_id,list_word,list_chineseValueif __name__ == '__main__':try:print('==========开始插入数据=========')dba = condba()filepath = r'D:\记得修改路径\1.txt'  fp = open(filepath,'r',encoding='UTF-8')#读取文件内容content = fp.readlines()#print(content)delete_sql = "truncate table all_words"dba.execute(delete_sql)print('all_words原数据已删除')for con in content:id,word,cv = run(con)insert_sql = str_temp = "insert into all_words values('%s','%s','%s')" % (id,word,cv)#print(insert_sql)dba.execute(insert_sql)     except Exception as e:conn.rollback()print(e)finally:conn.commit()conn.close()fp.close()print('==========数据插入结束=========')    

出现以下显示时表明数据插入完成。
在这里插入图片描述:其实若愿意的话,也可以将前面的建表语句放到后面的数据插入脚本中一次性执行,写个str字符串,将sql放进去后,用ora.execute(str)执行后再将其commit即可,此处没写进去是因为在plsql中用习惯了,方便修改。

数据插入完成后,便可以执行以下python脚本了

import cx_Oracle as cx
import randomdef condba():global connusername = 'briup'password = 'briup'host = '127.0.0.1:1521/XE'conn = cx.connect(username,password,host)cursor = conn.cursor()return cursor'''分4种模式:1.第一种按顺序五个五个出现word和cv  ,可以输入数字5尝试写例句用以加强记忆2.第二种里共有三种测试方式,前两种只出现翻译,填写word,并进行检测是否匹配,第1中是每15个进行一次检测,第2种是从开头一直检测到已学部分,第3种是有单词有翻译,进行选择,所有检测的结果会记录在表exam_fun2中3.第三种将所有false的进行再次复习与测验,1是进行复习,2是对二模式中测验错误的进行再次测验,若对了会更新记录4.将复习的表进行重置 --保留表中id = 1的值,方便重置后方法的运行,一切重新开始
'''def fun1(ora):count = 1print('您已选择第一种模式:')id_sql = "select * from (select * from  id_flag  order by id_value desc) where rownum = 1"ora.execute(id_sql)result = ora.fetchall()#print(result[0][0])order = '0'      #'0'继续学习,stop()结束学习id = result[0][0]  #读取数据库中表id_flag中最后一次记录的id值while id <= 5384:if(count == 4):print('已满15个,是否进行一次测验? Y/N')isCheck = input('请输入:')while isCheck:if isCheck == 'Y':exam3(ora)break  elif isCheck == 'N':print('继续学习')breakelse:print('请不要输入除了Y或N以外的内容:')isCheck = input('请输入:')count = 1  if order == 'stop()':breakelif order == '5':print('请写您的例句:',end='')example_sentence = input()id_str = '%d~%d' % (id-5,id)ex_sql = "insert into example_sentence_table values('%s','%s',to_char(sysdate,'yyyymmdd hh24:mi:ss'))" % (id_str,example_sentence);ora.execute(ex_sql)conn.commit()elif order == '0':print('===========================分隔符===========================')count = count + 1strsql = "select word,chinese_value from all_words where id >= %d and id < %d" % (id,id+5)#print(strsql) ora.execute(strsql)strsql_result = ora.fetchall()for v in strsql_result:#print(v[1])a ="%s :  %s" % (v[0],v[1])print(a)else:print('请输入正确的指令!')  insertId_sql = "insert into id_flag values(%d,to_char(sysdate,'yyyymmdd hh24:mi:ss'))" % (id)ora.execute(insertId_sql)conn.commit()  #每学习一次就要记录一次,方便方法2在测验的时候进行读取id范围id = id+5print('请输入指令:--stop()--退出,--5--自写例句,--0--下一个')print('===========================分隔符===========================')order = input('请输入:')print('第一种模式结束')#2.第二种只出现cv,填写word,并进行检测是否匹配,从id_flag表中读取id进行
def fun2(ora):print('*******模块2测验开始*******')print('**********分界线************')print('请输入数字1对已学进行阶段测验')print('请输入数字2对已学进行全面测验')print('请输入数字3对已学进行新的测验')print('**********分界线************')print('请输入一个数字或输入quit退出:')num = input('请输入:')while num != 'quit':if num == '1':           exam1(ora)elif num == '2':exam2(ora)elif num == '3':exam3(ora)else : print('输入有误!')print('**********分界线************')print('请输入数字1对已学进行阶段测验')print('请输入数字2对已学进行全面测验')print('请输入数字3对已学进行新的测验')print('**********分界线************')print('请输入一个数字或输入quit退出:')num = input('请输入:')  print('*****阶模块2测验结束*****')def exam1(ora):print('*****阶段性测验开始*****')str_sql = "select min(id_value),max(id_value) from (select * from  id_flag  order by id_value desc) where rownum < 5 order by 1" #读取记录表中的最后两条记录的id值ora.execute(str_sql)result = ora.fetchall()#print(result)id1 = result[0][0]id2 = result[0][1]str_sql2 = "select * from all_words where id >= %d and id <= %d" % (id1,id2+5)#print(str_sql2)ora.execute(str_sql2)sql2_cv = ora.fetchall()#print(sql2_cv)for t in sql2_cv:print(t[2])print('请输入对应的word值:')word = input('请输入:')if(word == t[1]):sql_check = "insert into exam_fun2 values(%d,'%s','%s',to_char(sysdate,'yyyymmdd hh24:mi:ss'),'true')" % (t[0],t[1],t[2])print('correct!')else:sql_check = "insert into exam_fun2 values(%d,'%s','%s',to_char(sysdate,'yyyymmdd hh24:mi:ss'),'false')" % (t[0],t[1],t[2])print('wrong! the correct answer is :'+ t[1])#print(sql_check)print('**********************分隔符*****************************')ora.execute(sql_check)conn.commit()print('*****阶段性测验结束*****')def exam2(ora):print('*****整体测验开始*****')str_sql2 = "select * from all_words where id <= (select max(id_value) from id_flag a)"#print(str_sql2)ora.execute(str_sql2)sql2_cv = ora.fetchall()#print(sql2_cv)for t in sql2_cv:print(t[2])print('请输入对应的word值:')word = input('请输入:')if(word == t[1]):sql_check = "insert into exam_fun2 values(%d,'%s','%s',to_char(sysdate,'yyyymmdd hh24:mi:ss'),'true')" % (t[0],t[1],t[2])print('correct!')else:sql_check = "insert into exam_fun2 values(%d,'%s','%s',to_char(sysdate,'yyyymmdd hh24:mi:ss'),'false')" % (t[0],t[1],t[2])print('wrong! the correct answer is :'+ t[1])#print(sql_check)print('**********************分隔符*****************************')ora.execute(sql_check)conn.commit()print('*****整体测验结束*****')def exam3(ora):print('*****选汉语测验开始*****')str_sql = "select min(id_value),max(id_value) from (select * from  id_flag  order by id_value desc) where rownum < 5 order by 1" #读取记录表中的最后两条记录的id值ora.execute(str_sql)result = ora.fetchall()#print(result)id1 = result[0][0]id2 = result[0][1]str_sql2 = "select * from all_words where id >= %d and id <= %d" % (id1,id2)  #获取最后两个id值#print(str_sql2)ora.execute(str_sql2)sql2_cv = ora.fetchall()#print(sql2_cv)value = {} #将单词和翻译放在字典中value2 = [] #但翻译放在字典中并序号,方便下面抽取for t in sql2_cv:value[t[1]] = t[2]   # 将这十几个里面抽取三个,与当前选择的值放在一起组成选项value2.append(t[2])#print(random.sample(value2, 3))temp = []new_temp = []for t in sql2_cv:temp = value2.copy() #将所有的翻译给复制到一个临时列表temp中temp.remove(t[2])  #这临时列表中将当前的单词翻译删掉new_temp = random.sample(temp,3)  #在没有当前翻译的剩下值中随机筛选3个组成新的列表new_temp.append(t[2])       #将当前单词的翻译添加进去new_temp = random.sample(new_temp,len(new_temp)) #再将组好的这个新列表进行随机排列print(t[1])count = 1for ft in new_temp:print(count,end='')print(' : ',end='')print(ft)count = count + 1        print('请从上列选项中选择对应的选项:')num = input('请输入选项(1~4)或者quit退出:')flag = 1while flag == 1 and num != 'quit':num = int(num) - 1if num >= 0 and num <= 3 :flag = 0else:print('您输入的值不在1~4之间,请重新输入!')num = input('请输入选项(1~4)或者quit退出:')#num = int(num) - 1if  num == 'quit':breakelif(new_temp[num] == t[2]):sql_check = "insert into exam_fun2 values(%d,'%s','%s',to_char(sysdate,'yyyymmdd hh24:mi:ss'),'true')" % (t[0],t[1],t[2])print('correct!')else:sql_check = "insert into exam_fun2 values(%d,'%s','%s',to_char(sysdate,'yyyymmdd hh24:mi:ss'),'false')" % (t[0],t[1],t[2])print('wrong! the correct answer is :')print(t[2])#print(sql_check)print('**********************分隔符*****************************')ora.execute(sql_check)conn.commit()print('*****选汉语测验结束*****')def fun3(ora):print('*****错重复习开始*****')err_sql  = " select count(*) \from exam_fun2 a ,(select  word,max(insert_time) as max_time from exam_fun2  group by word) b \where a.word = b.word \and a.insert_time = b.max_time  \and a.isright = 'false'\order by insert_time desc "ora.execute(err_sql)err_count = ora.fetchall()print('**********分界线************')if err_count:print('已积累错误个数:',end='')print(err_count[0][0])print('请输入数字1对错误进行再次复习')print('请输入数字2对复习进行再次测验')print('**********分界线************')print('请输入选择或者quit退出:')num = input('请输入:')while num != 'quit':if num == '1':print('**********分界线************')print('您输入的是1,开始对错误进行复习')str_sql = " select a.* \from exam_fun2 a ,(select  word,max(insert_time) as max_time from exam_fun2  group by word) b \where a.word = b.word \and a.insert_time = b.max_time  \and a.isright = 'false'\order by insert_time desc "     #读取测验表中的测验错误的单词ora.execute(str_sql)result = ora.fetchall()for v in result:a ="%s :  %s" % (v[1],v[2])print(a)print('**********分界线************')elif num == '2':print('**********分界线************')print('您输入的是2,开始对错误进行检验')str_sql = " select a.* \from exam_fun2 a ,(select  word,max(insert_time) as max_time from exam_fun2  group by word) b \where a.word = b.word \and a.insert_time = b.max_time  \and a.isright = 'false'\order by insert_time desc "#print(str_sql)ora.execute(str_sql)sql_cv = ora.fetchall()#print(sql_cv)for t in sql_cv:print(t[2])print('请输入对应的word值:')word = input('请输入:')if(word == t[1]):sql_check = "insert into exam_fun2 values(%d,'%s','%s',to_char(sysdate,'yyyymmdd hh24:mi:ss'),'true')" % (t[0],t[1],t[2])print('correct!')else:sql_check = "insert into exam_fun2 values(%d,'%s','%s',to_char(sysdate,'yyyymmdd hh24:mi:ss'),'false')" % (t[0],t[1],t[2])print('wrong! the correct answer is :'+ t[1])#print(sql_check)print('**********分界线************')ora.execute(sql_check)conn.commit()else:print('输入有误,请重新输入!')print('**********分界线************')print('请输入数字1对错误进行再次复习')print('请输入数字2对复习进行再次测验')print('**********分界线************')print('请输入数字选择或者quit退出:')num = input('请输入:')  print('*****错重复习结束*****')def fun4(ora):delete_exam_fun2 = 'delete from exam_fun2 where id > 1'delete_id_flag = 'delete from id_flag where id_value > 1'ora.execute(delete_exam_fun2)ora.execute(delete_id_flag)conn.commit()print('表中记录已重置')if __name__ == '__main__':ora = condba()print("*****请输入指令1或者2或者3或者4,输入exit()退出:*****")print('1. 开始学习单词')print('2. 来一次小测验')print('3. 复习一下上次测验的错误')print('4. 记录重置')print("********************分界线*********************")print('请输入一个选项:')str = input('请输入:')while str != 'exit()':#print(str)if str == '1':fun1(ora)elif str == '2':fun2(ora)elif str == '3':fun3(ora)elif str == '4':fun4(ora)else:print('您输入的选项无效,请重新输入!')str = input('请输入:')continueprint("*****请输入指令1或者2或者3或者4,输入exit()退出:*****")str = input('请输入:')print('bye')conn.close()

这里一共写了四个小功能,分为1,2,3,4四个选项:
在这里插入图片描述



第一个功能是直接显示单词与翻译,每五个为一组,按0进行下一组,按5可以对当前的单词自写例句,例句会保存在表EXAMPLE_SENTENCE_TABLE中。满15个就进行一次小测验,结果无论对错都会将其记录在表exam_fun2中,方便后面进行复习和再检测,输入stop()进行退出第一种模式。
在这里插入图片描述


第二个功能是测验功能,分三种:

在这里插入图片描述
第一种其实就是在1模式中的小测验,第二种是从第一个单词一直到你所学的单词为止全部进行一次测验。这前两种都是根据翻译写单词,第三种是根据单词选择翻译,有四种选项,正确答案是其中的一个。
在这里插入图片描述


第三个功能是将前面测验错误的进行重新学习与测验,当重新测验正确后,再下次学习错误单词时便不会再计入内。
在这里插入图片描述


第四个功能是将所有学习过的记录,或者错误的记录全部清除掉,一切重新开始,因此便可以进行重复学习
在这里插入图片描述
自此便是全部的功能,后续还将添加阅读题,以及对应的题目讲解等功能。
:本脚本的编写环境均由vscode所实现。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/55594.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

360 Total Security(360国际版)官方中文版V10.8.0.1269 | 360国际版和国内版区别很大-杀毒能力相当且非常纯净不流氓

360 Total Security&#xff08;360国际版&#xff09;是由奇虎360公司开发的纯净无明显商业推广行为且杀毒能力一流的360杀毒软件&#xff0c;360国际版是为广大用户的电脑安全及效能量身打造的专业免费杀毒软件&#xff0c;根据360国际版官网说明得知&#xff0c;360国际版内…

PHP 限制输出内容的字数

2019独角兽企业重金招聘Python工程师标准>>> 一、contentWordNumLimit($content, $maxWordNum) 1 作用描述&#xff1a;内容格式化(英文单双引号替换为中文&#xff0c;回车换行替换为html中的br标签&#xff0c;\n替换为空格)&#xff0c; 限制输出内容的字数&…

孩子写作业比较磨蹭,家长如何处理?

在生活中我们发现&#xff0c;很多孩子都特别磨蹭&#xff0c;比如吃饭磨蹭&#xff0c;收拾东西磨蹭&#xff0c;写作业磨蹭&#xff0c;明明很快就能完成的事情&#xff0c;到他们手下却会一拖再拖。有时候家长会很着急&#xff0c;催促厉害了&#xff0c;他们还会闹情绪&…

减轻教师作业批改负担的神奇—每日交作业之手机扫描批改

给教师们介绍一款免费又实用的客观题自动批改的产品 简介&#xff1a;手机扫描即可实现客观题的自动批改 特点&#xff1a; 1.无需特定纸张&#xff0c;大大减少纸张成本&#xff1b;无纸张大小限制 2.无需特定设备&#xff0c;使用微信小程序或者app扫描即可 3.即时生成详细的…

父母该如何辅导孩子做作业

孩 子们会对家庭作业存在抵触情绪&#xff0c;而对父母来说&#xff0c;如何让孩子完成作业&#xff0c;可能也是一个同样艰巨的任务。那么&#xff0c;让孩子完成作业的最好策略是什么&#xff1f;大人辅导孩子做作业和大人自己做作业之间的界限何在&#xff1f;小孩子做作业拖…

(转)来自一位作业辅导老师的经验分享

https://baijiahao.baidu.com/s?id1585466248617857440&wfrspider&forpc 最近看新闻&#xff0c;很多家长都会为孩子写作业的事头痛&#xff0c;作为一个曾经连续四年专职给孩子辅导作业&#xff0c;并让全班90%同学在其校期中、期末成绩提高的作业辅导老师忍不住分享…

分享一个撩妹神器,各种聊天话术技巧

现在的男孩子太不会聊天了&#xff0c;为了你们我也是操碎了心了&#xff0c;特意找了一款神器分享大家 分享薇 ggvv1992 祝大家早日脱单

恋爱话术库

前言 想要成功找到女朋友&#xff0c;高情商的撩妹思维非常重要&#xff0c;相信大家平时也看到了很多撩妹教学也学习了很多撩妹子技巧&#xff0c;但不可死记硬背&#xff0c;多去领悟其中的高情商思维&#xff0c;它才是核心要点。 因为每个女生的生存环境和经历是一样的&a…

聊天开头一般说什么好?聊天技巧幽默追女孩子

聊天开头一般说什么好&#xff1f;我们的第一个默契就是我不说话&#xff0c;她也沉默......,下来小编为大家带来聊天技巧幽默追女孩子&#xff0c;感兴趣的朋友快来看看吧。 聊天开头一般说什么好? 第一句话&#xff1a; 1&#xff0c;我们的第一个默契就是我不说话&#x…

恋爱话术小程序源码-土味情话,恋爱导师支持多种流量主模式

恋爱话术小程序源码-土味情话,恋爱导师支持多种流量主模式 源码简介源码演示下载地址 源码简介 恋爱话术小程序源码-土味情话 恋爱导师支持多种流量主模式 你猜的不错,这就是一款恋爱话术小程序 该款小程序相对来说还是挺强大的 这款小程序基本分段都是和外面几千块几百块的分…

恋爱话术库.免费版专为直们准备的恋聊天神器不知道怎么聊天的看过来

简介&#xff1a; 恋爱话术库一款可以帮你解决以上烦恼的App&#xff0c;海量话术库&#xff0c;遇到不知道怎么回复女生时&#xff0c;来这里搜一下&#xff0c;N精彩回复供您选择&#xff0c;让您和女生聊天不再烦恼。 &#xff1d;学会绵绵情话&#xff0c;享受美好爱情&a…

HomeKit、米家、智汀智能家居应该如何确保用户的安全和隐私

智能家居行业发展迅速&#xff0c;各类智能家居设备在一点一点的步入我们的家庭中。 但智能家居设备毕竟是物联网设备&#xff0c;在网络安全和隐私泄漏方面&#xff0c;大家还是存有疑惑的&#xff0c;人们的担忧开始浮出水面。由于过度依赖云基础设施和互联网连接&#xff0…

华为米家智能家居背后一些你不了解的小细节

目前市场上的智能家居种类繁多&#xff0c;相信大家要是想要了解的话肯定看得头疼&#xff0c;一时间不知道该从何下手&#xff0c;所以这一期我们就来聊一聊关于智能家居背后一些不为人知的小知识。 目前智能家居平台或品牌分两种&#xff1a;to c 的 和 tob 的&#xff0c;意…

小米要用 AI + IoT 做年轻人的第一套智能家居

今天&#xff0c;在小米 AIoT 开发者大会现场&#xff0c;雷军喊出了“AI IoT 是小米未来的核心战略”。同时&#xff0c;小米和宜家正式官宣在一起&#xff0c;宜家全系智能照明产品将接入小米 IoT 平台&#xff0c;可通过米家 App 及小米的小爱同学进行实时控制。 就这样&am…

除了小米、Homekit、欧瑞博等智能家居品牌,这款智能生态值得看

智能家居&#xff0c;这个概念对我们来说既熟悉也陌生&#xff0c;在未来科幻题材的电影中&#xff0c;我们经常看到主人公的家里充满各种高科技的东西&#xff0c;我们都会觉得很酷炫&#xff0c;恨不得里面的主人公就是自己。 例如2022年的背景冬奥会&#xff0c;那个机器人餐…

中控屏成智能家居新宠?

今年伊始&#xff0c;智能中控屏就火出了圈。据悉&#xff0c;今年3月份以来&#xff0c;智能家居领域的巨头玩家们米立、华为、萤石、小米、海尔智家旗下三翼鸟、欧瑞博、涂鸦智能等&#xff0c;都纷纷推出了智能中控屏产品。一时之间&#xff0c;智能中控屏成为了全屋智能领域…

智能家居中控屏(二):产品设计

第一部分主要介绍智能家居产品的定义、起源&#xff0c;本部分是第二部分&#xff0c;主要是中控屏产品的设计&#xff08;非设计一款智能中控屏&#xff09;&#xff0c;一人之言&#xff0c;仅供参考&#xff08;手动狗头&#xff09;。 本篇文字内容较多&#xff0c;介意者…

智能触摸面板开关一Homekit智能家居

触摸开关&#xff0c;即通过触摸方式控制的墙壁开关&#xff0c;其感官场景如同我们的触屏手机&#xff0c;只需手指轻轻一点即可达到控制电器的目的&#xff0c;随着人们生活品质的提高&#xff0c;触摸开关将逐渐将换代传统机械按键开关。 触摸开关控制原理 触摸开关我们把…

小米电视安装 Plex 打造家庭影院

背景 最近突然想重温教父&#xff0c;本来想着直接投屏就可以&#xff0c;后来看了别人搭建的基于 NAS 的家庭影院很动心&#xff0c;也想依葫芦画瓢做一个&#xff0c;跟对象申请经费的时候被拒了&#xff0c;理由是有这钱还不如开个会员直接看。 我寻思不同电影在不同的平台…

Yandex:你不可错过的全能搜索引擎

目录 前言一、Yandex网站介绍1-1、网站介绍1-2、优势 二、Yandex网站使用技巧2-1、Yandex搜索引擎2-2、Yandex Maps2-3、Yandex Mail2-4、Yandex Games2-5、Yandex Images2-6、Yandex Video2-7、Yandex.Translate 结语 前言 andex是一家俄罗斯的互联网公司&#xff0c;成立于19…