Python背单词记单词小程序,可自定义词库,支持多种记忆模式,根据词义拼写、选择单词,根据词意选择单词,可乱序抽查,可对错题进行反复抽查
完整程序源代码下载:Python背单词记单词小程序
词库生成代码
gen_old_tem8.py

import random
import time
import json
import tempfile
import sys
import os
import logging
import base64import requestsfrom wordson.gen.gensource import GenSourceif sys.version_info[0] < 3:try:from io import openexcept ImportError:from codecs import opentry:FileNotFoundError
except NameError:FileNotFoundError = IOErrorclass GenOldTEM8(GenSource):SEED = 0LOGGER = logging.getLogger('wordson.gen.gen_old_tem8.GenOldTEM8')def __init__(self, practice_day):name = time.strftime('%Y-%m-%d', time.localtime())super(GenOldTEM8, self).__init__('English', u'daily-tem8', name)self.start = (practice_day - 1) * 20self.end = self.start + 20def get_source(self):source_file = os.path.join(self.WORDSDIR, 'TEM8-old', 'tem8_all.json')with open(source_file, 'r', encoding='utf-8') as f:source_all = json.load(f)random.seed(self.SEED)random.shuffle(source_all)source_need = source_all[self.start: self.end]self.old_source_id_to_info = dict(('_'.join(each['word']), each) for each in source_need)return ((key, value['word']) for key, value in self.old_source_id_to_info.items())def get_meaning(self, word_id):info = self.old_source_id_to_info[word_id]old_meaning_info = info['meaning']result = []for old_type, old_meaning in old_meaning_info:if old_type is None:new_type = Noneelse:new_type = [old_type]new_meaning = [old_meaning]result.append({'type': new_type,'meaning': new_meaning,})return resultdef get_pronunciation(self, word_id):words = self.old_source_id_to_info[word_id]['word']word = words[0]result = []temp_dir = tempfile.gettempdir()info_file = os.path.join(temp_dir, word + '.json')try:with open(info_file, 'r', encoding='utf-8') as f:pr_info = json.load(f)except (FileNotFoundError, IOError):self.LOGGER.info('get from merriam for %s', word)pr_info = self.pronunciation_from_merriam(word)with open(info_file, 'w', encoding='utf-8') as f:json.dump(pr_info, f)for sound_mark, sound_url in pr_info.items():# sound_mark_b64 = self.str_b64(sound_mark)# sound_mark_b64 = wordsound_mark_safe = sound_marksound_wav = os.path.join(temp_dir, sound_mark_safe + '.wav')sound_mp3 = os.path.join(temp_dir, sound_mark_safe + '.mp3')try:with open(sound_wav, 'rb') as f:wav_bin = f.read()except (FileNotFoundError, IOError):if not os.path.isfile(sound_mp3):self.LOGGER.info('get from merriam for %s, mp3 %s', word, sound_url)resp = requests.get(sound_url)assert 200 <= resp.status_code < 300self.LOGGER.info('save mp3 to %s', sound_mp3)with open(sound_mp3, 'wb') as f:f.write(resp.content)assert os.path.isfile(sound_mp3)self.LOGGER.info('conver %s to %s', sound_mp3, sound_wav)try:self.ffmpeg_convert(sound_mp3, sound_wav)except BaseException:try:os.remove(sound_wav)except BaseException:passraisewith open(sound_wav, 'rb') as f:wav_bin = f.read()result.append((sound_mark, wav_bin))else:result.append((sound_mark, wav_bin))return self.ONE2ONE, result@staticmethoddef str_b64(s):return base64.b64encode(s.encode('utf-8')).decode('utf-8')if __name__ == '__main__':from wordson.bashlog import getloggergetlogger(None, logging.DEBUG)_, day_str = sys.argvpract = int(day_str)saver = GenOldTEM8(pract)saver.run()saver.save()

gensource.py

import os
import sys
import logging
import subprocess
import jsonfrom bs4 import BeautifulSoup
import requestsfrom wordson.util import PROJECTDIRif sys.version_info[0] < 3:try:from io import openexcept ImportError:from codecs import opentry:FileExistsError
except NameError:FileExistsError = OSErrortry:FileNotFoundError
except NameError:FileNotFoundError = IOErrorclass GenSource(object):LOGGER = logging.getLogger('wordson.gen.gensource.GenSource')WORDSDIR = os.path.join(PROJECTDIR, 'words')MIXED = 0ONE2ONE = 1def __init__(self, language, category, name):self.language = languageself.category = categoryself.name = nameself.rel_folder = os.path.join(language, category, name)self.save_folder = os.path.join(self.WORDSDIR, self.rel_folder)self.save_file = os.path.join(self.save_folder, 'index.json')self.result = []def run(self):result = self.resulttry:os.makedirs(self.save_folder)except (FileExistsError, OSError):passfor word_id, word in self.get_source():meaning = self.get_meaning(word_id)pr = self.get_pronunciation(word_id)if pr is None:pronunciation = Noneelse:# pronunciation = Noneif pr[0] == self.MIXED:_, sound_marks, wav_binaries = prsound_fnames = []for index, wav_bin in enumerate(wav_binaries):fname = '{}-{}.wav'.format(word_id, index)fpath = os.path.join(self.save_folder, fname)with open(fpath, 'wb') as f:f.write(wav_bin)sound_fnames.append(fname)pronunciation = {"mode": "mixed","value": {"soundmarks": sound_marks,"soundpaths": sound_fnames}}elif pr[0] == self.ONE2ONE:_, marks_binaries_pari = prvalue = []for index, (sound_mark, wav_bin) in enumerate(marks_binaries_pari):fname = '{}-{}.wav'.format(word_id, index)fpath = os.path.join(self.save_folder, fname)with open(fpath, 'wb') as f:f.write(wav_bin)value.append({"soundmark": sound_mark,"soundpath": fname})pronunciation = {"mode": "one2one","value": value}else:pronunciation = Noneassert Falseword_info = {'word': word,'meaning': meaning,'pronunciation': pronunciation,}self.LOGGER.info(word_info)result.append(word_info)def save(self):try:os.makedirs(self.save_folder)except FileExistsError:passwith open(self.save_file, 'w', encoding='utf-8') as f:json.dump(self.result, f, indent=4, ensure_ascii=False)config = {'name': self.name,'language': self.language,'category': self.category,'folder': self.rel_folder,'words': 'index.json',}config_file = os.path.join(self.WORDSDIR, 'index.json')try:with open(config_file, 'r', encoding='utf-8') as f:config_full = json.load(f)except (FileNotFoundError, IOError):config_full = []for each in config_full:# no dup saveif each == config:breakelse:config_full.append(config)with open(config_file, 'w', encoding='utf-8') as f:json.dump(config_full, f, indent=4, ensure_ascii=False)def get_source(self):"""e.g.{'word_id': ['spell1', 'spell2'],  // list, required}.items()"""passdef get_meaning(self, word_id):"""e.g.[{"type": ["n"],  // list, None when not avaliable"meaning": ["测试"]  // required, list},{"type": ["v"],"meaning": ["测试动词"]}]"""passdef get_pronunciation(self, word_id):"""three mode:return self.MIXED, ["soundmark1", "soundmark2"], [<wav-binary>, <wav-binary>, <wav-binary>]return self.ONE2ONE, [("soundmark1", <wav-binary>),("soundmark2", <wav-binary>),]"""pass@staticmethoddef pronunciation_from_merriam(word):page_url = 'https://www.merriam-webster.com/dictionary/{}'.format(word)resp = requests.get(page_url)assert 200 <= resp.status_code < 300, resp.status_codesoup = BeautifulSoup(resp.content, 'html5lib')result = {}for pr in soup.find_all(class_='pr'):# print(pr)sound_mark = pr.text.strip()print(sound_mark)prs = pr.parent# print(prs)a = prs.find('a')a_data_file = a.get('data-file')assert a_data_file is not Nonea_data_dir = a.get('data-dir')assert a_data_dir is not Nonesound_url = 'https://media.merriam-webster.com/audio/prons/en/us/mp3/{}/{}.mp3'.format(a_data_dir, a_data_file)print(sound_url)result[sound_mark] = sound_urlreturn result@staticmethoddef ffmpeg_convert(infile, outfile, ffmpeg='/usr/bin/ffmpeg'):cmd = [ffmpeg,'-y','-i', infile,'-strict', '-2',# '-an',outfile]return subprocess.check_call(cmd)if __name__ == '__main__':import sysresp = GenSource.pronunciation_from_merriam(sys.argv[1])print(resp)

完整程序源代码下载:Python背单词记单词小程序

Python背单词记单词小程序,可自定义词库,支持多种记忆模式,根据词义拼写、选择单词,根据词意选择单词相关推荐

  1. 微信小程序中使用字体库_小程序使用自定义字体库

    一.使用前端字体库 小程序前端默认不支持woff2/woff文件加载.但浏览器支持base64编码图片解析. 处理方案蒋woff2转码成base64编码即可. 自定义前端库使用阿里iconfont的即 ...

  2. 强大新UI神器微信小程序源码多模板支持多种流量主模式

    ☑️ 编号:ym314 ☑️ 品牌:无 ☑️ 语言:小程序 ☑️ 大小:113KB ☑️ 类型:装逼神器 ☑️ 支持:小程序

  3. 自编记单词小程序项目(自定义词库,多功能)C/C++语言实现

    一款方便实用又简洁的记单词小程序,自定义单词库,多功能协助记忆!!! github地址:https://github.com/Knock-man/Memorizing-words-program 如今 ...

  4. 【学习笔记】C#中HashTable和快速排序的用法,从单词频率统计小程序写起

    先瞎扯点别的.进入这个神圣的地方总需要些鞭策,阿西巴,我是被鞭策进来摆摊的程序猿.软件工程老师说,写程序,发博客,就来博客园.这是个号召力很强的口号.最近看网络营销 搜索引擎优化的书多一些,只能说王老 ...

  5. 计算机毕业设计Python+uniapp文具商城微信小程序(小程序+源码+LW)

    计算机毕业设计Python+uniapp文具商城微信小程序(小程序+源码+LW) 该项目含有源码.文档.程序.数据库.配套开发软件.软件安装教程 项目运行 环境配置: Pychram社区版+ pyth ...

  6. python做小程序-【实战案例】利用Python做出趣味版防沉迷小程序

    今天带领大家利用Python做出趣味版防沉迷小程序 查询电脑的所有进程 用Python循环检测电脑软件的运行情况,当发现游戏软件时弹出警告窗口,并截图保存.学会这项技能,就再也不怕孩子偷偷打游戏了.下 ...

  7. 微信 小程序 python 渲染_干货 | 微信小程序自动化测试最佳实践(附 Python 源码)...

    本文为霍格沃兹测试学院测试大咖公开课<微信小程序自动化测试>图文整理精华版,进阶学习文末加群! 随着微信小程序的功能和生态日益完善,很多公司的产品业务形态逐渐从 App 延升到微信小程序. ...

  8. 计算机毕业设计Python+uniapp学生考勤系统小程序(小程序+源码+LW)

    计算机毕业设计Python+uniapp学生考勤系统小程序(小程序+源码+LW) 该项目含有源码.文档.程序.数据库.配套开发软件.软件安装教程 项目运行 环境配置: Pychram社区版+ pyth ...

  9. 计算机毕业设计Python+uniapp校园服务微信小程序(小程序+源码+LW)

    计算机毕业设计Python+uniapp校园服务微信小程序(小程序+源码+LW) 该项目含有源码.文档.程序.数据库.配套开发软件.软件安装教程 项目运行 环境配置: Pychram社区版+ pyth ...

最新文章

  1. 引起SQL数据库超时的问题分析及解决办法
  2. 好想学python机器人_【Python成长之路】从零学GUI -- 制作智能聊天机器人
  3. boost::hana::plus用法的测试程序
  4. 1.3 编程基础之算术表达式与顺序执行 08 温度表达转化
  5. net core 中间件(MiddleWare)
  6. 19.9. MySQL Router
  7. python实例变量命名规则_Java,Python的一些命名规范
  8. java 图像膨胀_OpenCV3 Java图形图像上的膨胀(Imgproc.dilate)
  9. Linux建立信任主机
  10. 建立一个全数据管理的分析平台,该如何落实?
  11. 几种常用 css3 选择器解释
  12. 防范ARP网关欺骗, ip mac双向绑定脚本
  13. 量化选股常见的策略模型
  14. windows 10 下载工具
  15. 华硕顽石四代自主扩展内存条图解
  16. 高等数学 · 第一章 函数
  17. 2018年全国多校算法寒假训练营练习比赛(第五场)The Biggest Water Problem
  18. 统计语言模型,平滑方法,困惑度
  19. Connection to node -1 (/ip:9092) could not be established. Broker may not be available.
  20. 计算机网络大赛英文简称是什么,关于“中国高校计算机大赛网络技术挑战赛”(2018年)的通知...

热门文章

  1. java case 多个值_Java switch多值匹配操作详解
  2. centos i219 v linux,CentOS7安装i7 6600网卡驱动I219M
  3. 大数据课程基础与商城,共享单车,互联网广告实战视频
  4. 激活win7时报错,“很抱歉,程序无法在非MBR引导分区上进行激活”
  5. 猝死(Sudden death,SD)是人类的最严重的疾病。
  6. 通用查询实现方案(可用于DDD)[附源码] -- 简介
  7. 运放技术——基本电路分析
  8. 云贝餐饮o2o小程序-V2独立版【更新序列至2.5.1】独家修复商家登录/区域代理/分销商/会员卡/积分商城/文章/DIY (可线传)
  9. 自学Java day53 使用jvav实现 BitMap 数据结构 从jvav到架构师
  10. istat menus 6